如何解决TSQL-计算昨天到今天之间的值之间的差异,自联接问题
我已经从网上的各种答案中整理了代码,以获得所需的结果,但是,我不明白为什么它起作用了,我想知道JOIN在行数RowNum + 1的地方实际上在做什么。
最初的问题是计算从昨天到今天的值之间的百分比差异。我对“自我加入”有点模糊,但我确实了解“自我加入”。当我添加RowNum列时,这使我感到困惑。
问题
请问在自我加入中T2.RowNum = T1.RowNum +1是什么?
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
解决方法
假设您每天都有价值,更好的方法是使用SELECT ProductTotal,CountDate,(ProductTotal - prev_ProductTotal) * 1.0 / ProductTotal
FROM (SELECT t.*,LAG(ProductTotal) OVER (ORDER BY CountDate) as prev_ProductTotal
FROM #t1 t
) t
WHERE CountDate > CAST(GETDATE () - 1 AS DATE)
:
struct Config {
struct VConfig {
let text: String
}
let topViewConfig: VConfig
let bodyViewConfigs: [VConfig]
let bottomViewConfig: VConfig
}
,
请注意,正如我评论的那样,我在这里完全同意戈登的观点,在这里LAG
(或LEAD
)是正确的答案。要解释您在评论中提出的问题,“我不明白T2.RowNum = T1.RowNum +1的工作方式 ”:
JOIN
返回其中ON
中的表达式为true的行。当您拥有INNER JOIN
时,仅显示JOIN
两侧的表达式计算结果为True的行。对于LEFT JOIN
,先前返回的任何先前记录都不会“丢失”。 (还有其他类型的联接。)
对于T2.RowNum = T1.RowNum + 1
,这是基础数学。 2
与1
(1+1
)匹配,3
与2
(2+1
)匹配... 100
为与99
(99 + 1
)匹配。因此,根据CTE中定义的T1
顺序,来自ROW_NUMBER
的数据与“之后”行匹配。在这种情况下,该行将按升序排列CountDate
的“ next”值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。