我有以下 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)
感谢您的帮助,如果您需要更多数据或有任何疑问,请询问!
问题是您选择了
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