在一列上选择不同并返回所有其他列
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)