按不同的值排序的SQL选择唯一值

13

我想从我的表中选择所有不同的订单编号(order_ids),并按日期列对该列表进行排序。使用DISTINCT显然是一个查询范围参数,因此尝试像这样做是行不通的:

SELECT DISTINCT(orderId, datetime) 
FROM table 
ORDER BY datetime DESC

这会返回所有orderId和datetime的不同组合,所以我会得到多个orderId,而我不想要这样。因此,我认为DISTINCT子句不是解决这个问题的方法。请问有人可以提供任何解决这个问题的建议吗?

谢谢!

3个回答

22

如果一个订单有多行,你想显示哪个日期?也许是:

SELECT [orderId], MAX([datetime])
FROM [table]
GROUP BY [orderId]
ORDER BY MAX([datetime]) DESC

作为后续,如果我想选择表中的所有值,而不仅仅是orderId和datetime怎么办?我有一种感觉这是完全不同的问题,但是... - Erebus
您需要聚合所有列,或选择特定行(例如min(id)、max(id)等)并执行联接/子查询。 - Marc Gravell

3
也许使用公共表达式(CTE)会有所帮助:
WITH CTE
AS
(

SELECT orderId FROM table ORDER BY datetime DESC

)

SELECT DISTINCT orderId  FROM CTE

谢谢您的纠正,我一时间忘记了这不是 MSDN SQL 论坛 :) - unclepaul84
“ORDER BY”子句在视图、内联函数、派生表、子查询和公共表达式中无效,除非同时指定TOP、OFFSET或FOR XML。 - Atomosk
SQL Server是否保证CTE的排序得以维护?如果它确实有效,似乎是一件非常冒险的内部事情。特别是因为有正式正确的解决方案,可以保证所需的结果。 - Lukas Eder

0
SELECT DISTINCT * FROM 
  (SELECT value1 
   FROM table1 
   ORDER BY value2);

那对我有用。


这是不正确的。数据库可以自由地忽略派生表的 ORDER BY 子句,当使用哈希实现 DISTINCT 时,它将有效地执行此操作,例如在更复杂的查询中。您具体的数据库优化器实现可能已经意外地产生了所需的结果,但您不能依赖它! - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接