2013-06-25 71 views
3

有了我的數據,我有個人在不同日期多次進行評估。它看起來像這樣:SQL:計算不同行的一列日期之間的天數

╔════════╦═══════════╦═══════════╦═══════╗ 
║ Person ║ ID Number ║ Date  ║ Score ║ 
║ John ║ 134  ║ 7/11/2013 ║ 18 ║ 
║ John ║ 134  ║ 8/23/2013 ║ 16 ║ 
║ John ║ 134  ║ 9/30/2013 ║ 16 ║ 
║ Kate ║ 887  ║ 2/28/2013 ║ 21 ║ 
║ Kate ║ 887  ║ 3/16/2013 ║ 19 ║ 
║ Bill ║ 990  ║ 4/18/2013 ║ 15 ║ 
║ Ken ║ 265  ║ 2/12/2013 ║ 23 ║ 
║ Ken ║ 265  ║ 4/25/2013 ║ 20 ║ 
║ Ken ║ 265  ║ 6/20/2013 ║ 19 ║ 
║ Ken ║ 265  ║ 7/15/2013 ║ 19 ║ 
╚════════╩═══════════╩═══════════╩═══════╝ 

我想它在計算,因爲該人的第一次評估的天數到底有另一列。如果這更容易,我還會解決自上次評估以來的天數。

理想情況下,應該是這樣的:

╔════════╦═══════════╦═══════════╦═══════╦══════════════════╗ 
║ Person ║ ID Number ║ Date  ║ Score ║ Days Since First ║ 
║ John ║ 134  ║ 7/11/2013 ║ 18 ║ 0    ║ 
║ John ║ 134  ║ 8/23/2013 ║ 16 ║ 43    ║ 
║ John ║ 134  ║ 9/30/2013 ║ 16 ║ 81    ║ 
║ Kate ║ 887  ║ 2/28/2013 ║ 21 ║ 0    ║ 
║ Kate ║ 887  ║ 3/16/2013 ║ 19 ║ 16    ║ 
║ Bill ║ 990  ║ 4/18/2013 ║ 15 ║ 0    ║ 
║ Ken ║ 265  ║ 2/12/2013 ║ 23 ║ 0    ║ 
║ Ken ║ 265  ║ 4/25/2013 ║ 20 ║ 72    ║ 
║ Ken ║ 265  ║ 6/20/2013 ║ 19 ║ 128    ║ 
║ Ken ║ 265  ║ 7/15/2013 ║ 19 ║ 153    ║ 
╚════════╩═══════════╩═══════════╩═══════╩══════════════════╝ 

我使用Microsoft SQL Server 2008

+2

只是出於好奇,你用什麼工具格式化你的問題的表? – Andomar

+0

我用過:http://www.sensefulsolutions.com/2010/10/format-text-as-table.html – Ransom

+0

這是我第一次嘗試插入一張表格而不是一張圖片。我應該以不同的方式做到嗎? – Ransom

回答

5
select * 
,  datediff(day, min(Date) over (partition by [ID Number]), Date) 
from YourTable 

Live example at SQL Fiddle.

+1

我不確定這是否正確,他們希望當前行日期和以前的日期有所不同。這是一個運行總差異。 – Taryn

+3

@bluefeet:從問題:「自該人第一次評估以來的天數」 – Andomar

+1

也許,我正在尋找這不會產生的預期結果。 OP可能需要澄清。 – Taryn

1

您可以使用選項與APPLY操作

1 。當前行日期和之前的差異OU的日期

SELECT t1.*, 
     DATEDIFF(dd, ISNULL(o.[Date], t1.[Date]), t1.[Date]) AS [Days Since First] 
FROM YourTable t1 OUTER APPLY (
           SELECT TOP 1 [Date] 
           FROM YourTable t2 
           WHERE t1.[ID Number] = t2.[ID Number] 
           AND t1.[Date] > t2.[Date] 
           ORDER BY t2.[Date] DESC 
           ) o 

例子請參見第SQLFiddle

2.number天以來的第一次評估

SELECT t1.*, 
     DATEDIFF(dd, ISNULL(o.[Date], t1.[Date]), t1.[Date]) AS [Days Since First] 
FROM YourTable t1 OUTER APPLY (
           SELECT MIN(t2.[Date]) AS [Date] 
           FROM YourTable t2 
           WHERE t1.[ID Number] = t2.[ID Number]         
           ) o 

參見SQLFiddle

4

我喜歡Andomar的答案的例子,但如果你想找到兩天之間和總天數,因爲首先你可以這樣做:

SELECT a.* 
     ,ISNULL(DATEDIFF(day,b.Date,a.Date),0)'Since Previous' 
     ,datediff(day, min(a.Date) over (partition by a.[ID Number]), a.Date)'Since First' 
FROM (select *,ROW_NUMBER() OVER(PARTITION BY [ID Number] ORDER BY DATE)RowRank 
     from YourTable 
    )a 
LEFT JOIN (select *,ROW_NUMBER() OVER(PARTITION BY [ID Number] ORDER BY DATE)RowRank 
     from YourTable 
    )b 
ON a.[ID Number] = b.[ID Number] 
AND a.RowRank = b.RowRank + 1 

演示:SQL Fiddle

相關問題