gpt4 book ai didi

SQL先排序,然后在over子句中分区

转载 作者:行者123 更新时间:2023-12-02 22:58:21 25 4
gpt4 key购买 nike

我有一个问题,我想对已排序的表进行分区。有什么办法可以做到这一点吗?

我使用的是 SQL Server 2016。

输入表:

|---------|-----------------|-----------|------------|
| prod | sortcolumn | type | value |
|---------|-----------------|-----------|------------|
| X | 1 | P | 12 |
| X | 2 | P | 23 |
| X | 3 | E | 34 |
| X | 4 | P | 45 |
| X | 5 | E | 56 |
| X | 6 | E | 67 |
| Y | 1 | P | 78 |
|---------|-----------------|-----------|------------|

所需输出

|---------|-----------------|-----------|------------|------------|
| prod | sortcolumn | type | value | rowNr |
|---------|-----------------|-----------|------------|------------|
| X | 1 | P | 12 | 1 |
| X | 2 | P | 23 | 2 |
| X | 3 | E | 34 | 1 |
| X | 4 | P | 45 | 1 |
| X | 5 | E | 56 | 1 |
| X | 6 | E | 67 | 2 |
| Y | 1 | P | 78 | 1 |
|---------|-----------------|-----------|------------|------------|

我到目前为止:

SELECT
table.*,
ROW_NUMBER() OVER(PARTITION BY table.prod, table.type ORDER BY table.sortColumn) rowNr
FROM table

但这不会重新启动第四行的行号,因为它是相同的产品和类型。我怎样才能重新启动每个产品以及基于排序标准的每个类型更改,即使类型更改回之前的状态?这是否可以通过 ROW_NUMBER 函数实现,或者我是否必须使用 LEAD、LAG 和 CASES(这可能会使其非常慢,对吧?)

谢谢!

最佳答案

这是一个间隙和岛屿问题。您可以使用以下查询:

SELECT t.*, 
ROW_NUMBER() OVER (PARTITION BY prod ORDER BY sortcolumn)
-
ROW_NUMBER() OVER (PARTITION BY prod, type ORDER BY sortcolumn) AS grp
FROM mytable t

获取:

prod    sortcolumn  type    value   grp
----------------------------------------
X 1 P 12 0
X 2 P 23 0
X 3 E 34 2
X 4 P 45 1
X 5 E 56 3
X 6 E 67 3
Y 1 P 78 0

现在,字段grp可用于分区:

;WITH IslandsCTE AS (
SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY prod ORDER BY sortcolumn)
-
ROW_NUMBER() OVER (PARTITION BY prod, type ORDER BY sortcolumn) AS grp
FROM mytable t
)
SELECT prod, sortcolumn, type, value,
ROW_NUMBER() OVER (PARTITION BY prod, type, grp ORDER BY sortcolumn) AS rowNr
FROM IslandsCTE
ORDER BY prod, sortcolumn

Demo here

关于SQL先排序,然后在over子句中分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51078057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com