【问题标题】:How to get the value from the row above?如何从上面的行中获取值?
【发布时间】:2013-12-28 16:54:04
【问题描述】:

我正在运行查看 PatientID 和 TXNDAte 的查询,以确保他们遵守每 15 个月完成一次工作的规定。

ClientID TxnDate    TxnCode Appt#
57     7/15/2010    V107    1
327    1/31/2011    V107    1
416    12/4/2010    V175    1
416    12/3/2011    V157    2
416    2/9/2013     V157    3
431    5/7/2011     V175    1
431    3/29/2012    V201    2
574    7/16/2011    V107    1
669    12/18/2010   V107    1
669    12/17/2011   V107    2

我已使用 row_Number FUnction 来获取 Appt#,现在正在寻找执行类似操作的 case 语句。

Case
   When Appt# - 1 = 0 Then Null
   When Appt# - 1 > 0 Then **DateDiff (from the present row and subtract the date from previous row)**.

这当然是我遇到问题的地方。有人对我如何做到这一点有任何建议吗?

谢谢,

【问题讨论】:

  • 使用行号 a cte 进行查询,并在 appt# - 1 上将其与自身连接。然后您可以访问这两行。
  • 什么版本的 SQL Server? SQL Server 2012 有LAG/LEAD
  • SQL Server 2008。约翰我明白,只有 2 个应用程序。 3 个或更多应用呢?
  • 如果我理解你,你需要的是 lag() 函数。你可以在这里阅读:technet.microsoft.com/en-us/library/hh231256.aspx
  • Yaron- 2008 不支持滞后函数。太糟糕了,那本来很好很容易。不过还是谢谢。

标签: sql sql-server sql-server-2008 tsql row-number


【解决方案1】:

不使用LAGCTE,一个简单的解决方案是将您的表连接到自身...

SELECT ClientID, TxnDate, TxnCode, Appt#,
       (SELECT MAX(TxnDate)
        FROM data
        WHERE data.ClientID = current.ClientID
        AND data.TxnDate < current.TxnDate
       ) AS PreviousTxnDate
FROM data AS current

然后您可以将其用作生成的表来计算日期的差异...

SELECT ClientID, TxnDate, TxnCode, Appt#,
    DATEDIFF(Month, PreviousTxnDate, TxnDate) AS Months
FROM (
    SELECT ClientID, TxnDate, TxnCode, Appt#,
           (SELECT MAX(TxnDate)
            FROM data
            WHERE data.ClientID = current.ClientID
            AND data.TxnDate < current.TxnDate
           ) AS PreviousTxnDate
    FROM data AS current
) dataWithPrevious

【讨论】:

    【解决方案2】:

    你的输出是什么样的?

    你可以这样做,

    Declare @t table (ClientID int, TxnDate date,TxnCode varchar(10), Appt# int)
    insert into @t values(57,'7/15/2010','V107',1),(327,'1/31/2011','V107',1),
    (416,'12/4/2010','V175',1),
    (416,'12/3/2011','V157',2),
    (416,'2/9/2013','V157',3),
    (431,'5/7/2011','V175',1),
    (431,'3/29/2012','V201',2),
    (574,'7/16/2011','V107',1),
    (669,'12/18/2010','V107',1),
    (669,'12/17/2011','V107',2)
    
    select *,0 Nocloumn from @t where clientid not in (select clientid from @t where Appt# >1)
    
    union all
    
    select a.*, Case
       When a.Appt# - 1 = 0 Then Null
       When a.Appt# - b.Appt# =1 Then DateDiff (day,b.TxnDate,a.TxnDate) end Nocloumn
       from @t a
    inner join @t b on a.ClientID=b.ClientID and a.Appt#>b.Appt#
    where a.Appt# - b.Appt#=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2013-12-09
      相关资源
      最近更新 更多