如何插入每两个后续行的减法并将其插入新列

时间:2013-04-06 16:38:32

标签: sql sql-server tsql

我有一个关于在sql中编写查询的问题。

图1中的

我想从row1中减去第2行(在列日期中)并将其结果插入新列的row1中,其标题为“新近”。并再次从row2中减去row3并将其插入新列的row2中,依此类推。

picture 1

enter image description here

实际上我想计算每个用户活动的新近度。例如,在下图中,我为一个用户计算了这个(手动);我想通过在sql中编写查询来为所有用户执行此操作。

picture 2

enter image description here

............................................... ...........................................

和其他问题:

我还想计算当前日期之前每个用户的活动频率。我想计算每一行的频率。例如,对于此示例,对于用户abkqz,我们有:

user name     frequency
abkqz             4
abkqz             3
abkqz             2
abkqz             1
abkqz             0

2 个答案:

答案 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,然后进行自联接以将每一行与下一行连接,然后计算以天为单位的日期差异。

结果如下:

enter image description here

答案 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;