2013-04-06 48 views
0

我有一个关于在sql中编写查询的问题。如何插入每两个后续行的相减并将其插入到一个新列

在图片1我想从row1(在列日期)中减去第2行,并将其结果插入到新列的第1行中,标题为新近度。并再次从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 
+1

此问题未显示任何研究工作。 **做你的作业很重要**。告诉我们你发现了什么,***为什么它不符合你的需求。这表明你已经花时间去尝试帮助你自己了,它使我们避免重申明显的答案,最重要的是它可以帮助你得到更具体和相关的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit 2013-04-06 16:59:09

+0

谢谢。 我发现以下链接与我的问题相关:http://stackoverflow.com/questions/11366788/how-do-i-get-the-time-difference-between-each-subsequent-row-in-sql但是,当我运行这个查询时,它会扣除行而不考虑用户名。实际上我想按用户名分组。并为每个用户执行此过程。 – 2013-04-06 17:08:47

回答

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

+0

哇;很棒:)我写这个查询并得到了结果......非常感谢......你对频率有什么想法吗? – 2013-04-06 18:32:59

+0

如果有多个用户,Tom的查询将无法正常工作,但可以使用PARTITION BY子句轻松修复。另外,ROWNUMBER列可用于查找您想要的频率。以下是两个更改的查询:http://sqlfiddle.com/#!6/e59c3/2 – 2013-04-07 01:17:13

+0

非常感谢史蒂夫。但是频率的顺序是相反的,并且它的值应该是低一值(我们不应该考虑当前的日期)。因为频率是用户在当前日期之前有活动的次数。所以我应该有2,1,0而不是1,2,3 ...如果我问很多问题,非常抱歉,我是sql新手。 – 2013-04-07 05:35:43

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; 
+0

很多很多谢谢:)但我有SQL 2008,我希望我有2012年;你的代码非常简单和简短...如果我购买SQL 2012,我会试试这个。 – 2013-04-06 18:35:20

相关问题