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