Sql 如何插入后续两行的减法运算并将其插入到新列中

Sql 如何插入后续两行的减法运算并将其插入到新列中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个关于用sql编写查询的问题 在图1中,我想从第1行(列日期)中减去第2行,并将其结果插入标题为“最近”的新列的第1行。再次从第2行中减去第3行,并将其插入新列的第2行,依此类推 : 事实上,我想计算每个用户活动的最近性。例如,在下图中,我为一个用户(手动)计算了这个值;我希望通过在sql中编写查询来为所有用户实现这一点 : 徖 和其他问题: 我还想计算每个用户在当前日期之前的活动频率。我想计算每行的频率。例如,对于此示例,对于用户abkqz,我们有: user name fr

我有一个关于用sql编写查询的问题

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

:

事实上,我想计算每个用户活动的最近性。例如,在下图中,我为一个用户(手动)计算了这个值;我希望通过在sql中编写查询来为所有用户实现这一点

:

和其他问题:

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

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

假设下表结构

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
这将使用a来计算a,然后执行自联接以将每一行与下一行联接,然后以天为单位计算日期差

结果是:

尝试类似的方法(未经测试,因为示例数据仅发布在图片中)。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;

这个问题没有显示出任何研究成果。做家庭作业很重要。告诉我们你发现了什么,为什么它不能满足你的需要。这表明你花了时间来帮助自己,这使我们不必重复显而易见的答案,而且最重要的是,这有助于你得到更具体、更相关的答案。非常感谢。我发现以下链接与我的问题相关:但是,当我运行此查询时,它会在不考虑用户名的情况下减去行。事实上,我想按用户名分组。并为每个用户执行此过程。哇;太好了:)我写了这个查询,得到了结果。。。谢谢。。。您对频率有什么想法吗?如果有多个用户,Tom的查询将无法正常工作,但可以使用PARTITION BY子句轻松修复。此外,ROWNUMBER列可用于查找所需的频率。这是一个有两个变化的问题:非常感谢Steve。但是频率的顺序是相反的,而且它的值应该是1值更低(我们不应该考虑当前日期)。因为频率是用户在当前日期之前进行活动的次数。所以我应该有2,1,0而不是1,2,3。。。非常抱歉,如果我问了很多问题,我是sql新手。@SteveKass,我不知道你为什么说它不能与多个用户一起使用。我已经尝试添加另一个用户,它似乎像预期的那样工作。注意join子句包括[用户名]。如果你能提供更多的细节,那就太好了。@TomHunter我错了-你的查询很好。只需要使用分区BY,就可以让您的行号列给出O.P.想要的[frequency]。谢谢你让我跟进。非常感谢:)但是我有SQL 2008,我希望我有2012;您的代码非常简单和简短。。。如果我购买SQL 2012,我会试试这个。