我正在尝试检测行更改及其发生的行号,按特定列(日期(排序。
这是我正在使用的查询:
WITH x AS
(
SELECT
*, rn = ROW_NUMBER() OVER (ORDER BY date ASC)
FROM
[dbo].[DB]
)
SELECT
x.var1, x.var2, x.date, x.rn as RN, x.var3
FROM
x
LEFT OUTER JOIN
x AS y ON x.rn = y.rn + 1 AND x.var1 <> y.var1
WHERE
y.var1 IS NOT NULL
但是,我得到的输出并不总是相同的。有时数据按日期排序,有时则不按日期排序。另外,我并不总是得到所有的行更改。
这里可能出了什么问题?
任何帮助将不胜感激。
示例...
WITH x AS (
SELECT A.*
, rn = ROW_NUMBER() OVER (ORDER BY date, var1, var2, var3 ASC)
FROM [dbo].[DB] A)
SELECT x.var1, x.var2, x.date, x.rn as RN, x.var3
FROM x
LEFT OUTER JOIN x AS y
ON x.rn = y.rn + 1
AND x.var1 <> y.var1
WHERE y.var1 IS NOT NULL
ORDER BY Date, RN
ROW_NUMBER() OVER (ORDER BY date asc, var1, var2, var3 ASC)
之后可以具有唯一标识表中记录的任何字段date asc
。
问题是当系统订购 db.date 时,几条记录具有相同的日期。 由于您尚未为这些其他记录指定任何顺序,因此系统可以自由地将它们按任何顺序排列;因此,您可以在每次运行的记录上获得不同的行号。
由于您尚未在外部查询中指定order by date, rn
,因此这些结果也可能以任何顺序返回。