4

根据我的数据,我让个人在不同的日期多次进行评估。它看起来像这样:

╔════════╦═══════════╦═══════════╦═══════╗
║ 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

4

3 回答 3

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

SQL Fiddle 上的实时示例。

于 2013-06-25T17:30:33.637 回答
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 小提琴

于 2013-06-25T17:47:31.197 回答
1

您可以将选项与APPLY运算符一起使用

1.当前行日期与上一个日期的差异

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.自第一次评估以来的天数

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

于 2013-06-25T17:46:35.703 回答