【发布时间】:2020-12-06 19:07:54
【问题描述】:
我已将来自各种在线答案的代码拼凑在一起以获得我想要的结果,但我不明白它为什么会起作用,我想知道 JOIN 在 RowNum + 1 处实际做了什么。
最初的问题是计算一个值从昨天到今天的百分比差异。我对自加入有点模糊,但我确实了解自加入。当我添加 RowNum 列时,这让我很困惑。
问题
请问T2.RowNum = T1.RowNum + 1 在self join中是做什么的?
IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1
CREATE TABLE #T1 (
ProductTotal int
,CountDate date
)
INSERT INTO #t1
VALUES
(893911,'20200815')
,(888970,'20200816')
,(899999,'20200817')
WITH cte AS (
SELECT
ROW_NUMBER() OVER(ORDER BY CountDate) AS RowNum
,ProductTotal
,CountDate
FROM #t1
WHERE CountDate > CAST(GETDATE () - 2 AS DATE)
)
SELECT
t1.RowNum
,t1.ProductTotal
,CAST(((t1.ProductTotal - t2.ProductTotal) * 1.0 / t2.ProductTotal) * 100 AS DECIMAL(10,2)) AS ProductDiff
,t1.CountDate
FROM cte AS t1
LEFT JOIN cte t2 ON T2.RowNum = T1.RowNum + 1
【问题讨论】:
-
这里有什么你不明白的地方?
ROW_NUMBER做什么,或者T2.RowNum = T1.RowNum + 1如何工作?然而,就我个人而言,我会简单地使用LAG或LEAD函数,而不是自加入,这会将扫描次数从 2 次降低到 1 次。 -
嗨@Larnu,我了解 Row_Number 的工作原理,但我不明白 T2.RowNum = T1.RowNum + 1 的工作原理。谢谢!
标签: sql tsql sql-server-2014