我有一个查询:
select col_1 from table order by col_2
这可以返回像
的值3
5
3
2
我需要在这些内容中选择一个保留排序的不同项,也就是说我想要
select distinct(col_1) from table order by col_2
返回
3
5
2
但不是
5
3
2
这里是我实际想要做的事情。Col_1是用户ID,col_2是该用户的登录时间戳事件。因此,同一用户(col_1)可以有多个登录时间。我试图构建一个历史用户列表,其中显示他们在系统中出现的时间。我希望能够说“我们的第一个用户是,我们的第二个用户是”,以此类推。
那篇文章似乎建议使用group by,但group by并不意味着返回行的排序,因此我不明白为什么会适用于这里,因为它似乎没有保留任何排序。实际上,另一篇SO文章给出了一个例子,其中group by将破坏我正在寻找的排序:请参见sql中GROUP BY和ORDER BY之间的区别中的“Peter”。有没有办法保证后者的结果?奇怪的是,如果是我实现DISTINCT子句,我肯定会先按顺序进行排序,然后取结果并对列表进行线性扫描,并自然地保留排序,所以我不确定为什么行为如此未定义。
编辑:
谢谢大家!我接受了IMSoP的答案,因为他不仅提供了一个互动示例供我玩耍(感谢你让我知道SQL Fiddle),而且还解释了为什么一些东西能够工作,而不仅仅是“这样做”。具体来说,GROUP BY并不会破坏(而是将它们保留在某种内部列表中)组外其他列中的值,这些值仍然可以在ORDER BY子句中进行检查。
ORDER BY
子句,数据的顺序将不能得到保证。如果您想按照特定的顺序排列数据,那么必须使用order by
。 - TarynORDER BY
的查询可以按任意顺序返回其结果集。如果您想要特定的顺序,请使用ORDER BY
。如果没有ORDER BY
,则结果就是一个表。对于表来说,顺序并不重要。 - ypercubeᵀᴹ