获取每组行的最新 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)
组合是唯一的情况下才有效。
所以我梳理了多页的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)
组合是唯一的情况下才有效。