0

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

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

图片1

在此处输入图像描述

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

图二

在此处输入图像描述

..................................................... …………………………………………………………………………………………………………………………………………

和其他问题:

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

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

2 回答 2

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

这使用公用表表达式来计算行号,然后进行自连接以将每一行与下一行连接起来,然后以天为单位计算日期差。

这是结果:

在此处输入图像描述

于 2013-04-06T17:54:46.707 回答
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;
于 2013-04-06T17:59:26.167 回答