|
我有一个关于在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使用公共表达式计算行号,然后执行自连接,将每行与下行连接,然后计算日期差。 |
|