回答

收藏

如何将减法插入每两行后的行中并插入新列?

技术问答 技术问答 175 人阅读 | 0 人回复 | 2023-09-13

我有一个关于在sql编写查询问题。
  g7 ?, U& r3 @- v- I! E图1中,我想从第一行减去第二行(以列日期为准),并将结果插入标题Recency的新列的row1.然后从第二列减去第三列,插入新列的第二列,等等。: k# {7 [: ^& r, }: N, X" G+ v: ?
事实上,我想计算每个用户活动的新近度。例如,在下图中,我为用户(手动)计算了这一点;我想通过sql编写查询,为所有用户执行此操作。7 P, X& w5 O2 M7 }
...................................................! K# V9 [' W$ ?0 S) q( t
........................................................./ D& Y: H: F1 p( m
还有其他问题:/ {, u) r( R3 t- m4 r$ [+ Y
我还想计算每个用户在当前日期前的活动频率。我想计算每行的频率。例如,对于这个例子,对于abkqz用户,我们有:; z$ Q, L+ _1 }7 }' M! o3 q3 A1 E% s
user name     frequencyabkqz       abkqz       abkqz        abkqz       abkqz                                               
: w! f0 ~% P  @0 |7 Q( Z! R    解决方案:                                                                6 Q5 s& J  {) z. i% z* m
                                                                假设下表结构6 Y5 Q) k9 m; d' S2 }1 g" ~/ \! H
CREATE TABLE [15853354] -- Stack Overflow question number(    [user-name] VARCHAR(20),   [submissions] INT,   [date] DATE,   [score] NUMERIC   [points] NUMERIC(9,1))INSERT [15853354]VALUES abkqz',5,'12 JUL 2010',83.91,112.5),  abkqz',5,'9 JUN 2010',77.27,0),   ('abkqz',5,'17 MAY 2010',91.87,315)然后,您可以编写以下查询" q3 p. X8 d% k+ v! U" Y  R
;WITH [cte15853354] AS(    SELECT         [user-name],       [submissions],       [date],       [score],       [points],       ROW_NUMBER() OVER (ORDER BY [user-name],[date] DESC) AS [ROWNUMBER]    FROM [15853354])SELECT     t.[user-name],   t.[submissions],   DATEDIFF(DAY,ISNULL([t-1].[date],t.[date]),t.[date]) AS [recency],   t.[score],   t.[points]FROM [cte15853354] tLEFT JOIN [cte15853354] [t-1]    ON [t-1].[user-name] = t.[user-name]    AND [t-1].[ROWNUMBER] = t.[ROWNUMBER]   1使用公共表达式计算行号,然后执行自连接,将每行与下行连接,然后计算日期差。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则