|
我有一个关于在sql编写查询问题。
* z. C T) q) k, a图1中,我想从第一行减去第二行(以列日期为准),并将结果插入标题Recency的新列的row1.然后从第二列减去第三列,插入新列的第二列,等等。
2 G' L( h( @2 e/ v2 I" Y! a事实上,我想计算每个用户活动的新近度。例如,在下图中,我为用户(手动)计算了这一点;我想通过sql编写查询,为所有用户执行此操作。. K$ _- b. Z2 a
.................................................... h: M# D0 B* I& P$ {4 U$ J
.........................................................! K2 F/ R! {4 `% B; a% v% e& [
还有其他问题:
- b- C9 k' |. u& t6 X& E3 m我还想计算每个用户在当前日期前的活动频率。我想计算每行的频率。例如,对于这个例子,对于abkqz用户,我们有:
9 F: p/ P. I4 @* o- ^ t8 C8 k2 Quser name frequencyabkqz abkqz abkqz abkqz abkqz
- L/ Z# n6 T* N& w& Y: J 解决方案:
3 Q% ] A7 S) Y) Q1 X) ]2 o0 I 假设下表结构1 ]2 B: z2 a3 t% t
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)然后,您可以编写以下查询! _6 M+ N7 X7 h6 ?6 I- I1 H) I
;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使用公共表达式计算行号,然后执行自连接,将每行与下行连接,然后计算日期差。 |
|