SQL - 从上面的行返回值

LaL*_*aLa 2 sql t-sql database sql-server sql-server-2008

我有一张桌子:

Book        ¦Time Out       ¦Time In 
123456789   ¦01/01/2013 ¦07/07/2013
123456788   ¦15/01/2013 ¦20/01/2013
123456788   ¦23/01/2013 ¦30/01/2013
123144563   ¦01/02/2013 ¦18/02/2013
123144563   ¦20/02/2013 ¦NULL
124567892   ¦03/03/2013 ¦10/03/2013
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

Book        ¦Time Out       ¦Time In        ¦Next Time Out
123456789   ¦01/01/2013     ¦07/07/2013     ¦NULL
123456788   ¦15/01/2013     ¦20/01/2013     ¦23/01/2013
123456788   ¦23/01/2013     ¦30/01/2013     ¦NULL
123144563   ¦01/02/2013     ¦18/02/2013     ¦20/02/2013
123144563   ¦20/02/2013     ¦NULL           ¦NULL
124567892   ¦03/03/2013     ¦10/03/2013     ¦NULL
Run Code Online (Sandbox Code Playgroud)

码:

SELECT nextout.Book,
       nextout.[Time In] AS NextTimeIn
FROM   BookTable nextout
       JOIN BookTable nextoutsec
         ON nextout.Book = nextoutsec.Book
WHERE  nextout.[Time In] = (SELECT MAX(maxtbl.[Time In])
                            FROM   BookTable maxtbl
                            WHERE  maxtbl.Book = nextout.Book) 
Run Code Online (Sandbox Code Playgroud)

这将为重复的书籍ID返回相同的"下一次超时".而不是1个正确的值和1个空值.

谢谢!

Lie*_*ers 5

未经测试,但以下内容应该让你开始

;WITH q as (
  SELECT Book, [Time In], ROW_NUMBER() OVER (PARTITION BY Book ORDER BY [Time In]) AS rn
  FROM   BookTable
)
SELECT  bt.*, q2.[Time In] AS NextTimeIn
FROM    BookTable bt
        INNER JOIN q q1 ON q1.Book = bt.Book AND ISNULL(q1.[Time In], 0) = ISNULL(bt.[Time In], 0)
        LEFT OUTER JOIN q q2 ON q2.Book = q1.Book AND q2.rn = q1.rn + 1
Run Code Online (Sandbox Code Playgroud)

这个的要点是

  • q 为每本书添加一个行号,按顺序排列 [Time In]
  • q2加入q1以获得下一个[Time In]值.
  • q1加入BookTable以获取所有原始值

  • 很好的解决方案:) ps.不应该是`LEFT OUTER JOIN q q2 ON` (2认同)