Sql 如何选择两个不同的列?

Sql 如何选择两个不同的列?,sql,postgresql,group-by,Sql,Postgresql,Group By,我希望能够选择两个不同于按id排序的col1和col2 我很难做到这一点,因为当我编写以下SQL查询时 SELECT DISTINCT col1, col2 FROM table ORDER BY id 我不能按id排序,因为它不在SELECT语句中,但如果我将id放入SELECT语句中,它将采用不同的id col1和col2。这基本上就是整个表,因为id列是唯一的 如何做到这一点?这是一种方法: select A.col1, A.col2 from (select id, col1, co

我希望能够选择两个不同于按id排序的col1和col2

我很难做到这一点,因为当我编写以下SQL查询时

SELECT DISTINCT col1, col2
FROM table
ORDER BY id
我不能按id排序,因为它不在SELECT语句中,但如果我将id放入SELECT语句中,它将采用不同的id col1和col2。这基本上就是整个表,因为id列是唯一的


如何做到这一点?

这是一种方法:

select A.col1, A.col2
from 
(select id, col1, col2
from Tablet
order by id) A
left join 
(select min(id) id2, col1, col2
from Tablet
GROUP BY COL1, COL2) B
on A.COL1 = B.COL1 AND A.COL2=b.COL2
where A.id = B.id2
LIMIT 4;

以下是可以使用聚合的

,并将聚合函数放在
order by
子句中:

select col1, col2 from mytable group by col1, col2 order by min(id) limit 10
如果任务的意思是“如果
(col1,col2)
存在重复项,则删除所有此类重复项,但
id
值最大的重复项除外”,则

为什么是“最伟大的”?因为

因此,它应该删除第3行而不是第4行,因为它是重复的

如果记录需要最少的
id
值,则将MAX()替换为MIN()


PPS。看起来真正的任务是“显示聊天历史记录中最后10条原始消息”。

您真正使用的数据库引擎是什么?以文本形式提供表的DDL和示例数据,并为这些数据设计结果。添加行(4,你好,朋友)。当您按id订购时,Hello Friend应该在Hello敌人之前还是之后?本质上,这是不可能的,因为您要从col1和col2中选择不同的值。它们不与id关联。例如,可能有100个col1具有相同的值,但100个不同的id不一定按顺序排列。
distinct on()
maybe?我不确定
orderbymin(id)limit 10
是否与前十名最明显的匹配…@Akina:实际上我不清楚前十名最明显的含义是什么,但肯定OP可以根据需要调整排序方向。我已经更新了我的答案,我的演示也不正确。主要记住,当/如果子查询中的ORDERBY没有伴随LIMIT时,它将被忽略。总是。更准确地说,它将在执行计划构建期间从查询文本中删除。因此,它的存在不会产生任何影响。从未。每次当你得到的结果看起来像是正确的,由于这种排序的存在-它是随机的。唯一的例外情况是使用用户定义的变量,但在这种情况下,执行是隐藏的游标,而不是实体查询。我将等待。评论家的工作轻松愉快。不像诗人的作品…对不起。。。现在好了。特别是如果按id、计数(id)CNT和
CNT=1或
顺序删除多余的片段。我不同意这种说法:“通过id删除订单”,我们没有相同的结果。但是我将移除cnt,并且cnt=1。那么现在开始投票吧?@VBoka也许。。。但解释(或至少描述)或证明这种不正确是很好的。而且,请注意,我说过“如果任务意味着…”-因此,对于这个任务理解,必须显示不正确性。因此,从这个演示中:您认为您的代码可以吗?即使是“如果任务意味着…”对不起…@VBoka你认为你的代码可以吗?当然可以。在将我的查询更正为您的任务理解后(将MAX替换为MIN,将DESC替换为ASC,将10替换为4),我的查询给出的结果与您的查询完全相同。
SELECT DISTINCT MAX(id) OVER (PARTITION BY col1, col2) id, col1, col2
FROM sourcetable
ORDER BY id DESC /* not sure in this point */
LIMIT 10