0

这是示例数据:

|    date    |   id   |  version  |
| 2013-04-15 | 'ape'  |    1.1    |
| 2013-04-15 | 'bat'  |    2.1    |
| 2013-04-15 | 'cat'  |    3.1    |
| 2013-04-15 | 'dog'  |    4.1    |
| 2013-03-15 | 'ape'  |    1.0    |
| 2013-03-15 | 'cat'  |    3.2    |
| 2013-03-15 | 'dog'  |    3.8    |
| 2013-02-15 | 'ape'  |    0.9    |
| 2013-02-15 | 'dog'  |    3.1    |

查询将确定最新日期和第二个最新日期。在示例中,这是 2013-4-15 和 2013-3-15。

我可能会找到使用此代码的人,因为这是我所知道的:

DECLARE @FirstDate DATETIME
SET @FirstDate = (SELECT max(date)
              FROM mytable)

DECLARE @SecondDate DATETIME
SET @SecondDate = (SELECT max(date)
              FROM mytable
              WHERE date < @FirstDate)

我想要这样的输出:

|    date     |   id   |  version   |   prevdate   | pversion   |
| 2013-04-15  | 'ape'  |    1.1     |  2013-03-15  |   1.0      |
| 2013-04-15  | 'bat'  |    2.1     |  2013-03-15  |   null     |
| 2013-04-15  | 'cat'  |    3.1     |  2013-03-15  |   3.2      |
| 2013-04-15  | 'dog'  |    4.1     |  2013-03-15  |   3.8      |

所以查询会找到所有日期 = FirstDate 的行。对于每一行,它将查看 date = SecondDate 行并包含具有相同 id 的行的版本号。如果没有具有相同 id 的 date = SecondDate 行,则返回“null”或“”或 0 或其他内容。

4

1 回答 1

0

好的,这是一种方法:

SELECT A.*, B.[date] prevdate, B.[Version] pVersion
FROM myTable A
OUTER APPLY (SELECT TOP 1 [date], [Version]
             FROM myTable
             WHERE [date] < A.[date]
             AND id = A.id) B
WHERE A.[date] = (SELECT MAX([date]) FROM myTable)

这是结果:

╔════════════╦═════╦═════════╦════════════╦══════════╗
║    date    ║ id  ║ Version ║  prevdate  ║ pVersion ║
╠════════════╬═════╬═════════╬════════════╬══════════╣
║ 2013-04-15 ║ ape ║ 1,1     ║ 2013-03-15 ║ 1        ║
║ 2013-04-15 ║ bat ║ 2,1     ║ NULL       ║ NULL     ║
║ 2013-04-15 ║ cat ║ 3,1     ║ 2013-03-15 ║ 3,2      ║
║ 2013-04-15 ║ dog ║ 4,1     ║ 2013-03-15 ║ 3,8      ║
╚════════════╩═════╩═════════╩════════════╩══════════╝

这是一个带有演示的sqlfiddle 。

于 2013-06-14T16:07:00.087 回答