2013-04-06 56 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

相關問題