我有一个关于在sql中编写查询的问题。
图1中的我想从row1中减去第2行(在列日期中)并将其结果插入新列的row1中,其标题为“新近”。并再次从row2中减去row3并将其插入新列的row2中,依此类推。
实际上我想计算每个用户活动的新近度。例如,在下图中,我为一个用户计算了这个(手动);我想通过在sql中编写查询来为所有用户执行此操作。
............................................... ...........................................
和其他问题:
我还想计算当前日期之前每个用户的活动频率。我想计算每一行的频率。例如,对于此示例,对于用户abkqz,我们有:
user name frequency
abkqz 4
abkqz 3
abkqz 2
abkqz 1
abkqz 0
答案 0 :(得分:1)
假设有以下表格结构
CREATE TABLE [15853354] -- Stack Overflow question number
(
[user-name] VARCHAR(20),
[submissions] INT,
[date] DATE,
[score] NUMERIC(9,2),
[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)
然后你可以编写以下查询
;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] t
LEFT JOIN [cte15853354] [t-1]
ON [t-1].[user-name] = t.[user-name]
AND [t-1].[ROWNUMBER] = t.[ROWNUMBER] + 1
这使用Common Table Expression来计算row number,然后进行自联接以将每一行与下一行连接,然后计算以天为单位的日期差异。
结果如下:
答案 1 :(得分:1)
尝试这样的事情(未经测试,因为样本数据仅发布在图片中)。查询用户在SQL Server 2012中引入的分析函数选项,因此这不适用于早期版本。
select
[user-name],
submissions,
score,
datediff(day,
lag([date],1) over (
partition by [user-name]
order by [date],
[date]) as recency,
count(*) over (
partition by [user-name]
order by [date] desc) -1 as frequency
from yourTable;