[英]SQL Server : select specific row from groups based on multiple conditions
我有一个包含ID, Status, Date
列的表。
我必须根据Date
的ID
和年份+月份进行分组,以便根据一些条件为每个月和每个 ID 获取一行(它可以在一个月内有更多状态,每个状态都有自己的行):
如果它有状态为“I”的行和/或状态为“R”的行和/或状态为“S”的行,它必须返回状态为“I”的行(只应包括这 3 种状态,还有更多状态,但它们不应该受到影响——无论如何它们都应该出现)
如果它有状态为“R”的行和状态为“S”的行,则它必须返回状态为“S”的行。
我尝试使用ROW_NUMBER
和自连接,但无济于事。
例如(2021 年 9 月,记得按年+月分组):
你能帮忙吗?
谢谢你!
这主要只是选择正确的分组标准的问题
SELECT
t.ID,
Month = EOMONTH(t.Date),
Status = CASE WHEN COUNT(CASE WHEN t.Status = 'I' THEN 1 END) > 0 THEN 'I'
WHEN COUNT(CASE WHEN t.Status = 'S' THEN 1 END) > 0 THEN 'S'
WHEN COUNT(CASE WHEN t.Status = 'R' THEN 1 END) > 0 THEN 'R'
ELSE MIN(Status) END
FROM YourTable t
GROUP BY
t.ID,
EOMONTH(t.Date),
CASE WHEN Status NOT IN ('I','R','S') THEN Status END;
尝试这个:
create table #test_group(id int, stat varchar(16), dt datetime default getdate())
insert into #test_group(id, stat) values (1, 'I')
insert into #test_group(id, stat) values (1, 'R')
insert into #test_group(id, stat) values (1, 'S')
insert into #test_group(id, stat) values (2, 'I')
insert into #test_group(id, stat) values (2, 'R')
insert into #test_group(id, stat) values (2, 'S')
insert into #test_group(id, stat) values (2, 'O')
insert into #test_group(id, stat) values (3, 'I')
insert into #test_group(id, stat) values (3, 'R')
insert into #test_group(id, stat) values (4, 'I')
insert into #test_group(id, stat) values (4, 'R')
insert into #test_group(id, stat) values (4, 'O')
insert into #test_group(id, stat) values (5, 'R')
insert into #test_group(id, stat) values (5, 'S')
insert into #test_group(id, stat) values (6, 'R')
insert into #test_group(id, stat) values (6, 'S')
insert into #test_group(id, stat) values (6, 'O')
insert into #test_group(id, stat) values (7, 'O')
insert into #test_group(id, stat) values (7, 'Z')
insert into #test_group(id, stat) values (7, 'F')
insert into #test_group(id, stat) values (8, 'I')
insert into #test_group(id, stat) values (8, 'R')
insert into #test_group(id, stat) values (8, 'S')
insert into #test_group(id, stat) values (8, 'I')
insert into #test_group(id, stat) values (8, 'R')
insert into #test_group(id, stat) values (8, 'S')
insert into #test_group(id, stat) values (8, 'R')
insert into #test_group(id, stat) values (8, 'S')
insert into #test_group(id, stat) values (8, 'S')
insert into #test_group(id, stat) values (8, 'O')
insert into #test_group(id, stat) values (8, 'Z')
insert into #test_group(id, stat) values (8, 'F')
insert into #test_group(id, stat) values (9, 'R')
insert into #test_group(id, stat) values (9, 'O')
insert into #test_group(id, stat) values (9, 'Z')
insert into #test_group(id, stat) values (9, 'F')
insert into #test_group(id, stat) values (9, 'S')
insert into #test_group(id, stat) values (10, 'R')
insert into #test_group(id, stat) values (10, 'O')
select * from #test_group
select id, DATEPART(year,dt)dtY,datepart(month, dt)dtM,
case when min(stat) = 'I' then 'I' else case when max(stat) = 'S' then 'S' else 'R' end end stat
from #test_group where stat in ('I','R','S')group by id, DATEPART(year,dt),datepart(month, dt)
union all
select id, DATEPART(year,dt)dtY,datepart(month, dt)dtM, stat
from #test_group where stat not in ('I','R','S')group by id, DATEPART(year,dt),datepart(month, dt), stat
order by dty,dtm,id,stat
drop table #test_group
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.