我正在尝试创建一个 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/