【发布时间】:2018-12-07 06:01:39
【问题描述】:
我有一个问题,我想对排序表进行分区。有什么办法可以做到吗?
我使用的是 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
但这不会重新启动第 4 行的行号,因为它是相同的产品和类型。 我如何根据排序标准在每个产品和每个类型更改时重新启动,即使类型更改回以前的状态?这甚至可以使用 ROW_NUMBER 函数还是我必须使用 LEAD 和 LAG 和 CASES (这可能会使其非常慢,对吧?)
谢谢!
【问题讨论】:
-
当您确实需要前一行的信息用于您的逻辑时,我看不出如何避免滞后/领先
-
您为什么认为
LEAD和/或LAG会使查询变慢? -
这就是我到目前为止的经验......但是它来自旧版本的 oracle,在新的 sql server 上会更好吗?请记住,该表是中等大小(大约 2 mio 行)
-
Oracle 和 SQl Server 是非常不同的产品。根据我的经验,
LAG和LEAD非常有效,并且比按照FROM MyTable MT LEFT JOIN MyTable MTl ON MT.ID +1 = MTl.ID的方式执行JOIN要好得多
标签: sql sql-server tsql row-number gaps-and-islands