在一列上选择不同并返回所有其他列

Posted

技术标签:

【中文标题】在一列上选择不同并返回所有其他列【英文标题】:Select distinct on one column and return all other columns 【发布时间】:2020-02-02 06:35:36 【问题描述】:

我正在尝试根据修改后的日期查找不同的订单。我要排序,找到最新修改的订单。

我尝试像在 postgreSQL 中那样做。 select distinct on (orders) * from the table; 但这会在 mariaDB 的情况下引发错误

Orders          Modified Date
------          ---------------
23031185    2019-09-24 19:36:51
23031185    2019-09-24 22:01:57
23031185    2019-09-24 19:32:28
23031185    2019-09-24 19:33:25
23031185    2019-09-24 19:33:18



The expected output should be the latest one 

Orders          Modified Date
------          ---------------
23031185    2019-09-24 22:01:57

我还有其他专栏。我需要根据订单列与所有​​其他列获取所有不同的行。

【问题讨论】:

查看 [groupwise-maximum] 标签。 【参考方案1】:

在最新版本的 MariaDB 中,您可以使用 ROW_NUMBER() 对共享同一 orders 的组中的记录进行降序排列,然后过滤每个组的顶部记录:

SELECT *
FROM (
    SELECT
        t.*,
        ROW_NUMBER() OVER(PARTITION BY orders ORDER BY modified_date DESC) rn
    FROM mytable t
) x
WHERE rn = 1

在早期版本中,您可以使用带有NOT EXISTS 条件的相关子查询:

SELECT *
FROM mytable t
WHERE NOT EXISTS (
    SELECT 1
    FROM mytable t1
    WHERE t1.orders = t.orders AND t1.modified_date > t.modified_date
)

或者您可以使用子查询返回每个组的最大日期并加入它:

SELECT *
FROM mytable t
WHERE modified_date = (
    SELECT MAX(t1.modified_date)
    FROM mytable t1
    WHERE t1.orders = t.orders
)

【讨论】:

【参考方案2】:

是不是很简单

SELECT  Orders,
        MAX(Modified Date) AS LatestDate
    FROM table
    GROUP BY Orders;

【讨论】:

以上是关于在一列上选择不同并返回所有其他列的主要内容,如果未能解决你的问题,请参考以下文章

在一列上选择 DISTINCT,返回多个其他列(SQL Server)

在一列上选择 DISTINCT,返回多个其他列(SQL Server)

在一列上选择 DISTINCT

MYSQL 在一列上选择两个值

如何在 Access 2016 中的另一列上选择具有最大值的不同行

使用 T-SQL 中的 OVER 子句在除一列之外的所有列上选择 DISTINCT