【问题标题】:Show one row if all values except one column are equal如果除一列之外的所有值都相等,则显示一行
【发布时间】:2020-10-01 17:31:34
【问题描述】:

我通常按产品显示订单的运输状态。但是当除“项目”之外的所有值都相同时,我希望只显示一行(哪一行无关紧要)。我尝试了SELECT DISTINCTGROUP BY,但我需要排除“项目”列。

| item | status  | ship_date  | est_ship_date | order_num | tracking_number |
-----------------------------------------------------------------------------
| abc  | Shipped | 2020-06-01 | 2020-06-01    | 123       | xyz             |
| cde  | Shipped | 2020-06-01 | 2020-06-01    | 123       | xyz             |
| efg  | Shipped | 2020-06-01 | 2020-06-01    | 123       | xyz             |

我尝试过的:

SELECT DISTINCT item, status, ship_date, est_ship_date, order_num, tracking_number 
from orders
where order_num = 123

我知道如果我排除项目,我会得到一排,但我必须保留它。我无法排除“项目”

【问题讨论】:

    标签: sql-server select group-by distinct greatest-n-per-group


    【解决方案1】:

    你可以使用row_number():

    select *
    from (
        select 
            t.*,
            row_number() over(
                partition by status, ship_date, est_ship_date, order_num, tracking_number
                order by item
            ) rn
        from mytable t 
    ) t
    where rn = 1
    

    (status, ship_date, est_ship_date, order_num, tracking_number) 上存在重复项时,这将为您提供具有最小item 的行。

    另一个选项是聚合(它有效,因为您只排除一列):

    select status, ship_date, est_ship_date, order_num, tracking_number, min(item) item
    from mytable
    group by status, ship_date, est_ship_date, order_num, tracking_number
    

    【讨论】:

    • row_number中的表名是哪一个
    • @EvikGhazarian:那是mytable
    • 聚合工作谢谢。第一个选择仍然是返回多行
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多