仅查询最近的行

问题描述 投票:0回答:1

我有以下 SQL,它没有按照我的预期进行操作 - 它应该只根据 STARTDATE 查询每个 ITEMID 的最新行,我只对每个 ITEMID 中的最新行感兴趣。 这似乎返回其他行,不知道为什么。

WITH GA as (
    SELECT LABEL, ITEMID, STARTDATE, UNIT, UNITTYPE, BUILDING, 
           ROW_NUMBER() OVER (PARTITION BY ITEMID ORDER BY STARTDATE ASC) AS rn,
           CASE
                WHEN UNIT is NULL THEN 'Unit Null'
                WHEN UNIT is not NULL then 'Type Null'
                ELSE 'Other'
           END AS WP
    FROM GLA
    WHERE LABEL = 'CUSTOMER'
    AND ((UNIT is not NULL and UNITTYPE is NULL)
         OR (UNIT is NULL and UNITTYPE is not NULL)
    )
)
SELECT *
FROM GA
WHERE rn > 1
项目ID 开始日期 单位 单位类型 建筑
123 2016-01-06 00:00:00.000 首页
123 2020-01-06 00:00:00.000 单位 离开
567 2019-01-06 00:00:00.000 周五
888 10B 约克

ITEMID 可以有多行,但我只对最近的一行感兴趣,希望这一点很清楚。 我该如何修复我的代码或者它完全损坏了? 我是通过在网上搜索得到的,所以如果它是垃圾,我深表歉意,但感谢您的帮助!

(对于给定的数据,它应该返回第二行和第四行,因为这是最新的并且符合条件,但 STARTDATE 也可以为 NULL)

感谢您的帮助,如果您需要更多数据或有任何疑问,请询问!

sql-server
1个回答
0
投票

问题是您选择了

rn>1
所在的所有行,这意味着您将获得每个
ITEMID
除了第一行之外的所有行。但是,您只需要每个
ITEMID
的最新行,即具有最高
STARTDATE
的行。

这是更正后的查询:

WITH GA as (
    SELECT LABEL, ITEMID, STARTDATE, UNIT, UNITTYPE, BUILDING, 
           ROW_NUMBER() OVER (PARTITION BY ITEMID ORDER BY STARTDATE DESC) AS rn,
           CASE
                WHEN UNIT is NULL THEN 'Unit Null'
                WHEN UNIT is not NULL then 'Type Null'
                ELSE 'Other'
           END AS WP
    FROM GLA
    WHERE LABEL = 'CUSTOMER'
    AND ((UNIT is not NULL and UNITTYPE is NULL)
         OR (UNIT is NULL and UNITTYPE is not NULL)
    )
)
SELECT *
FROM GA
WHERE rn = 1

此查询将仅返回基于

ITEMID()
的每个
STARTDATE
的最新行。

这里是微软如何获取最新数据的文档:https://learn.microsoft.com/en-us/answers/questions/832731/get-the-data-of-only-latest-date-and-时间戳-fr

© www.soinside.com 2019 - 2024. All rights reserved.