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

标签 sql sql-server

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

相关文章:

mysql - 使用 IFNULL 将 NULL 设置为零

c# - 即使生成的 SQL 很快, Entity Framework 也会随着添加的额外连接而逐渐变慢

sql-server - 引用列的统计信息是否会阻止删除该列?

asp.net - 在一个查询中插入多条记录

sql - 使用 bcp 实用程序将 SQL 查询导出到文本文件

sql - 为什么 PL/pgSQL 函数可以有副作用,而 SQL 函数不能?

mysql - 从 3 个表进行大查询

sql-server - 无法创建大小为 8937 的行,该行大于允许的最大值 8060

sql - SQL 中的 SELECT 语句用于过滤掉多个条目

mysql 查询 : How can I group by only cpm. ad_id 并拥有所有 cc 的总和?