SQL 服务器,子集 a table 并根据条件创建新列
SQL Server, subset a table and create new column based on condition
如果我在 SQL 中有一个 table 作为:
id
code
1
6
1
8
1
4
2
3
2
7
2
4
3
7
3
6
3
7
我需要做的,逻辑上是:
- 按id分组时获取每组的第一行,按code排序
- 创建一个新列以显示代码列是否在组内的任何位置包含 7
想要的结果:
id
code
c7
1
4
N
2
3
Y
3
6
Y
我认为 SELECT 中需要一个“CASE WHEN”语句,但还没有解决。我可以执行什么查询来获取此信息?
您似乎可以使用 MIN
和条件聚合:
SELECT id,
MIN(Code) AS Code,
CASE WHEN COUNT(CASE code WHEN 7 THEN 1 END) > 0 THEN 'Y' ELSE 'N' END AS C7
FROM dbo.YourTable
GROUP BY id;
可能有更好的方法来做到这一点,但我想到的是,首先您必须根据该标准对 table 进行分区以获得最上面的那个,然后再加入自己找到带有 7
的那些
declare @table1 table (id int not null, code int not null)
insert into @table1 (id, code)
values
(1,6),
(1,8),
(1,4),
(2,3),
(2,7),
(2,4),
(3,7),
(3,6),
(3,7)
select id, code, c7
from (
select t.id ,t.code
,(CASE WHEN c.id is null then 'N' else 'Y' END) as c7
,ROW_NUMBER() OVER (PARTITION BY t.id order by t.code) AS p
from @table1 t
left outer join (
select id, code, 'Y' as c7
from @table1
where code = 7) c on c.id = t.id
) sorted
where sorted.p = 1
如果我在 SQL 中有一个 table 作为:
id | code |
---|---|
1 | 6 |
1 | 8 |
1 | 4 |
2 | 3 |
2 | 7 |
2 | 4 |
3 | 7 |
3 | 6 |
3 | 7 |
我需要做的,逻辑上是:
- 按id分组时获取每组的第一行,按code排序
- 创建一个新列以显示代码列是否在组内的任何位置包含 7
想要的结果:
id | code | c7 |
---|---|---|
1 | 4 | N |
2 | 3 | Y |
3 | 6 | Y |
我认为 SELECT 中需要一个“CASE WHEN”语句,但还没有解决。我可以执行什么查询来获取此信息?
您似乎可以使用 MIN
和条件聚合:
SELECT id,
MIN(Code) AS Code,
CASE WHEN COUNT(CASE code WHEN 7 THEN 1 END) > 0 THEN 'Y' ELSE 'N' END AS C7
FROM dbo.YourTable
GROUP BY id;
可能有更好的方法来做到这一点,但我想到的是,首先您必须根据该标准对 table 进行分区以获得最上面的那个,然后再加入自己找到带有 7
的那些declare @table1 table (id int not null, code int not null)
insert into @table1 (id, code)
values
(1,6),
(1,8),
(1,4),
(2,3),
(2,7),
(2,4),
(3,7),
(3,6),
(3,7)
select id, code, c7
from (
select t.id ,t.code
,(CASE WHEN c.id is null then 'N' else 'Y' END) as c7
,ROW_NUMBER() OVER (PARTITION BY t.id order by t.code) AS p
from @table1 t
left outer join (
select id, code, 'Y' as c7
from @table1
where code = 7) c on c.id = t.id
) sorted
where sorted.p = 1