【发布时间】:2021-06-22 13:26:54
【问题描述】:
在下面的数据中,d1 更改为 d2,然后返回 d1,分区在 d 列上,因此分区正确地从第 2 行的 d1->d2 重置并且 rn = 1。我希望分区也可以重置d2->d1,即记录#3 也应该有 rn = 1。
如何解决这个问题?
SELECT
t.*,
rn = ROW_NUMBER() OVER (PARTITION BY d ORDER BY id)
FROM
(VALUES (1, 'd1'), (2, 'd2'), (3, 'd1')) t (id, d)
ORDER BY
id
【问题讨论】:
-
那是正确的;那是值
d1的 2nd 行;第一个是id的值为1。 -
那么分区的顺序是什么。 d 列发生变化,因此它也必须是第三行的新分区
-
对数据进行分区...它完全按照它说的做,将数据分组。在这种情况下,
d的每个不同值对应 1 个组,d、'd1'和'd2'和 3 行只有两个不同的值,因此其中一行的值为 2 ;特定值的第二行。在这种情况下,当id的值为3时,这就是值'd1'的第2 行。它的工作方式与预期完全一致,并且符合记录。 -
您可以将整体
row_number() - 1除以 2 以获得分组的行号
标签: sql-server aggregate-functions window-functions