英文:
Group by and select rows based on if value combinations exist
问题
我有一个表格 PetsTable
:
Id | Type | key | value |
---|---|---|---|
1 | "猫" | 10 | 5 |
1 | "猫" | 9 | 2 |
2 | "狗" | 10 | 5 |
1 | "猫" | 8 | 4 |
1 | "猫" | 6 | 3 |
2 | "狗" | 8 | 4 |
2 | "狗" | 6 | 3 |
3 | "猫" | 13 | 5 |
3 | "猫" | 10 | 0 |
3 | "猫" | 8 | 0 |
如何将这些数据插入到新表格 MyPets
中,并满足以下条件:
- 按 Id 分组
- 仅选择在组内存在 (key = 10 and value = 5)、(key = 8 and value = 4) 和 (key = 6 and value = 3) 的行
- 如果存在 key = 9,则标记 hasFee = 1,否则 hasFee = 0
最终表格应如下所示:
Id | Type | hasFee |
---|---|---|
1 | "猫" | 1 |
2 | "狗" | 0 |
英文:
I have a table PetsTable
:
Id | Type | key | value |
---|---|---|---|
1 | "Cat" | 10 | 5 |
1 | "Cat" | 9 | 2 |
2 | "dog" | 10 | 5 |
1 | "Cat" | 8 | 4 |
1 | "Cat" | 6 | 3 |
2 | "dog" | 8 | 4 |
2 | "dog" | 6 | 3 |
3 | "Cat" | 13 | 5 |
3 | "Cat" | 10 | 0 |
3 | "Cat" | 8 | 0 |
How to insert this data into a new table MyPets
from PetsTable
with these conditions:
- Group by Id
- Only select rows when in the group exists (key = 10 and value = 5) and (key = 8 and value = 4) and (key = 6 and value = 3)
- If exists key = 9, then mark hasFee = 1 else hasFee = 0
Final table should look like:
Id | Type | hasFee |
---|---|---|
1 | "Cat" | 1 |
2 | "dog" | 0 |
答案1
得分: 4
以下是翻译好的部分:
一种方法是使用窗口函数来评估您的条件,然后您可以将其作为条件应用于使用公共表表达式的情况。
这将创建您所需的数据,然后将其轻松插入到您选择的表中。
create table Test (Id int, [Type] varchar(3), [Key] int, [Value] int);
insert into Test (Id, [Type], [Key], [Value])
values
(1, 'Cat', 10, 5),
(1, 'Cat', 9, 2),
(2, 'Dog', 10, 5),
(1, 'Cat', 8, 4),
(1, 'Cat', 6, 3),
(2, 'Dog', 8, 4),
(2, 'Dog', 6, 3),
(3, 'Cat', 13, 5),
(3, 'Cat', 10, 0),
(3, 'Cat', 8, 0);
with cte as (
select *
, sum(case when [Key] = 10 and [Value] = 5 then 1 else 0 end) over (partition by Id) Cond1
, sum(case when [Key] = 8 and [Value] = 4 then 1 else 0 end) over (partition by Id) Cond2
, sum(case when [Key] = 6 and [Value] = 3 then 1 else 0 end) over (partition by Id) Cond3
, sum(case when [Key] = 9 then 1 else 0 end) over (partition by Id) HasFee
from Test
)
select Id, [Type], HasFee
from cte
where Cond1 = 1 and Cond2 = 1 and Cond3 = 1
group by Id, [Type], HasFee;
返回结果:
Id | Type | HasFee |
---|---|---|
1 | Cat | 1 |
2 | Dog | 0 |
注意:如果您以这种格式提供样本数据(DDL+DML),将会使人们更容易提供帮助。
英文:
One approach is to use window functions to evaluate your conditions, which you can then apply as conditions using a CTE.
This creates the data you desire, its then trivial to insert into a table of your choice.
create table Test (Id int, [Type] varchar(3), [Key] int, [Value] int);
insert into Test (Id, [Type], [Key], [Value])
values
(1, 'Cat', 10, 5),
(1, 'Cat', 9, 2),
(2, 'Dog', 10, 5),
(1, 'Cat', 8, 4),
(1, 'Cat', 6, 3),
(2, 'Dog', 8, 4),
(2, 'Dog', 6, 3),
(3, 'Cat', 13, 5),
(3, 'Cat', 10, 0),
(3, 'Cat', 8, 0);
with cte as (
select *
, sum(case when [Key] = 10 and [Value] = 5 then 1 else 0 end) over (partition by Id) Cond1
, sum(case when [Key] = 8 and [Value] = 4 then 1 else 0 end) over (partition by Id) Cond2
, sum(case when [Key] = 6 and [Value] = 3 then 1 else 0 end) over (partition by Id) Cond3
, sum(case when [Key] = 9 then 1 else 0 end) over (partition by Id) HasFee
from Test
)
select Id, [Type], HasFee
from cte
where Cond1 = 1 and Cond2 = 1 and Cond3 = 1
group by Id, [Type], HasFee;
Returns:
Id | Type | HasFee |
---|---|---|
1 | Cat | 1 |
2 | Dog | 0 |
Note: If you provide your sample data in this format (DDL+DML) you make it much easier for people to assist.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论