获取每组行的最新 2 个值 SQL Server 2000

Getting newest 2 values per group of rows SQL Server 2000

所以我梳理了多页的Whosebug问题,似乎我一直在接近但没有得到我需要的确切结果......所以我屈服于提交这个问题。

首先是在 SQL Server 2000 服务器上...我知道这很糟糕。

我有 2 个表在一个 sql 查询中链接在一起,这总体上是相当基本的。示例数据如下:

我用来获取该数据的查询是:

SELECT DISTINCT
AH.locationid as locationid
,AH.adate as date
,Min( CASE WHEN Asum.code = '201' THEN Amount END ) AS attrib1
,Min( CASE WHEN Asum.code = '204' THEN Amount END ) AS attrib2
,Min( CASE WHEN Asum.code = '206' THEN Amount END ) AS attrib3
,Min( CASE WHEN Asum.code = '212' THEN Amount END ) AS attrib4
,Min( CASE WHEN Asum.code = '215' THEN Amount END ) AS attrib5
,Min( CASE WHEN Asum.code = '218' THEN Amount END ) AS attrib6
,Min( CASE WHEN Asum.code = '221' THEN Amount END ) AS attrib7
,Min( CASE WHEN Asum.code = '231' THEN Amount END ) AS attrib8
,AH.checkid as checktype
FROM [asum] ASum

INNER JOIN [Ahead] AH
ON  Asum.AID = AH.AID

WHERE AH.code IN ('212','201','206','204','215','218','221','231')

AND AH.checkid <> 'c'
AND AH.checkid <> 'b'

GROUP BY 
 AH.code
,ASum.amount
,AH.adate
,AH.checkid

ORDER BY 
 AH.locationid
,AH.adate
,attrib1
,attrib2
,attrib3
,attrib4
,attrib5
,attrib6
,attrib7
,attrib8
,AH.checkid'

所以我想做的是 return 每个位置的最新两个日期以及这两个最新日期的所有属性。

所以我实际上是在尝试获得如下所示的内容:

我最接近的是将下面的内部连接代码添加到查询中,这让我得到了最高日期...我面临的问题是如何从我内部连接的这个子查询中获取两个最大日期.

  INNER JOIN (SELECT 
                locationid,
                MAX(adate) as newest

             FROM   ahead

             GROUP BY locationid) t1
 ON t1.locationid = AH.locationid
 AND t1.newest = AH.adate

因此,通过内部连接,我只得到每个位置 ID 的 1 个,而不是像我需要的每个位置 ID 的两个。粗略的部分是这是在 SQL Server 2000 数据库上...呃。

非常感谢任何 tips/advice!

我无法测试它,因为我没有 SQL Server 2000,但我认为这可能有效:

 INNER JOIN (SELECT a1.locationid,
                    MAX(a1.adate) as newest,
                    MAX(a2.adate) as second_newest
               FROM ahead a1
               JOIN ahead a2
                 ON a2.locationid = a1.locationid
                AND a2.adate < a1.adate
              GROUP BY a1.locationid) t1
ON t1.locationid = AH.locationid
AND (t1.newest = AH.adate OR t1.second_newest = AH.adate)

编辑:看看 John Bollinger 的评论,我应该补充一点,我只希望在 (locationid, adate) 组合是唯一的情况下才有效。