gpt4 book ai didi

sql - 在 SQL 中选择特定的不同列

转载 作者:行者123 更新时间:2023-12-01 09:15:22 25 4
gpt4 key购买 nike

我正在尝试创建一个 select 语句,以便它在一列上执行特定的不同操作。我正在努力使每个 id 中没有多个水果。如果一个 id 下有多个水果,我只想使用 1 个批准的水果,而不是腐烂的水果。如果该 id 下只有 1 个水果,请使用它。

SELECT id, fruit, fruitweight, status 
FROM myfruits

Raw data from current select    

id | fruit | fruitweight | status
1 | apple | .2 | approved
1 | apple | .8 | approved
1 | apple | .1 | rotten
1 | orange | .5 | approved
2 | grape | .1 | rotten
2 | orange | .7 | approved
2 | orange | .5 | approved

约束后应该如何格式化

    id |  fruit  | fruitweight | status
1 | apple | .2 | approved
1 | orange | .5 | approved
2 | grape | .1 | rotten
2 | orange | .7 | approved

我可以按照 select distinct id,fruit,fruitweight,status from myfruits 的方式做一些事情,但这只会在所有列都相同的情况下删除重复项。

最佳答案

具有聚合和 row_number 的 CTE。

declare @YourTable table (id int, fruit varchar(64), fruitweight decimal(2,1),status varchar(64))
insert into @YourTable
values
(1,'apple',0.2,'approved'),
(1,'apple',0.8,'approved'),
(1,'apple',0.1,'rotten'),
(1,'orange',0.5,'approved'),
(2,'grape',0.1,'rotten'),
(2,'orange',0.7,'approved'),
(2,'orange',0.5,'approved')


;with cte as(
select
id
,fruit
,fruitweight = min(fruitweight)
,[status]
,RN = row_number() over (partition by id, fruit order by case when status = 'approved' then 1 else 2 end)
from
@YourTable
group by
id,fruit,status)

select
id
,fruit
,fruitweight
,status
from
cte
where RN = 1

另一种方法,没有聚合...假设您想要 first fruightweight

;with cte as(
select
id
,fruit
,fruitweight
,[status]
,RN = row_number() over (partition by id, fruit order by case when status = 'approved' then 1 else 2 end, fruitweight)
from
@YourTable)

select
id
,fruit
,fruitweight
,status
from
cte
where RN = 1

关于sql - 在 SQL 中选择特定的不同列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com