SQL - 如果同一组中的日期不同,如何编写 CASE WHEN?

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

我想要一个列来关注与其组没有匹配日期的行。 所以当州和城市相同但日期不同时,显示“日期不匹配”。

资料:

状态 城市 日期
德克萨斯州 奥斯汀 2023
德克萨斯州 奥斯汀 2023
德克萨斯州 奥斯汀 2020
德克萨斯州 休斯顿 2023
德克萨斯州 休斯顿 2023

我的示例代码:

SELECT
    State,
    City,
    Date,
    CASE
        WHEN --Logic here -- 
    THEN 'Date Mismatch'
    ELSE NULL
    END
FROM
    Table
WHERE 
    State IN (SELECT state FROM table GROUP BY state, city, date)
    AND
    City IN (SELECT city FROM table GROUP BY state, city, date)

预期效果:

状态 城市 日期 支票专栏
德克萨斯州 奥斯汀 2023 日期不匹配
德克萨斯州 奥斯汀 2023 日期不匹配
德克萨斯州 奥斯汀 2020 日期不匹配
德克萨斯州 休斯顿 2023
德克萨斯州 休斯顿 2023
sql sql-server tsql case window-functions
2个回答
1
投票

您可以为此使用窗口函数。简单比较

MIN
MAX

SELECT *,
  Checks =
    CASE WHEN MIN(Date) OVER (PARTITION BY State, City)
           <> MAX(Date) OVER (PARTITION BY State, City)
         THEN 'Date Mismatch' END
FROM YourTable t;

db<>小提琴


0
投票

您可以使用 WINDOW FUNCTION(DENSE_RANK) 来查找 DistincCount 日期

然后检查 DistincCount 以获取支票列日期


    
;with _City_State as (

    select state
        ,city
        ,dates 
       , DENSE_RANK() OVER (PARTITION BY state,city ORDER BY dates ASC) +
         DENSE_RANK() OVER (PARTITION BY state,city ORDER BY dates DESC) - 1 AS DistincCount
    from City_State

)

select 
        state
        ,city
        ,dates as date
        ,case when DistincCount=1 then '' else 'Date Mismatch' end  as [Checks Column]
from _City_State

您可以使用以下语句插入基础数据:


 drop table if exists City_State

create table City_State (state nvarchar(100), city nvarchar(100), dates varchar(4));

insert into City_State values ('Texas', 'Austin', '2023')
insert into City_State values ('Texas', 'Austin', '2023')
insert into City_State values ('Texas', 'Austin', '2020')
insert into City_State values('Texas', 'Houston', '2023')
insert into City_State values('Texas', 'Houston', '2023')

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