秩序和区别冲突

时间:2015-05-20 14:56:30

标签: sql postgresql

假设我有一个包含3列的表格 - 字母和数字以及像这样的asci

  1 a !
  1 a ?
  2 a ^
  3 b *
  5 a $
  7 a &

我想创建一个查询,以便它首先按字母顺序排序,然后按顺序排序

所以结果将是(不同的数字,按字母排序,然后是id,然后是asci。在这种情况下! < ?

1 a !
2 a ^
5 a $
7 a &
3 b *


select distinct on(number),letter, ascii
from table
order by letter, number, ascii

所以这不会在数字上有所区别。但是PG要求不同的列在顺序中看起来是相同的。

如何做到这一点?

2 个答案:

答案 0 :(得分:0)

你不能ORDER 任何 ......&#34;明显地。&#34;

ORDER BY有义务对呈现给它的每条记录进行排序。因此,如果您希望返回的数据集中的值为DISTINCT,则只需指定:

SELECT DISTINCT number, letter
  FROM table
  ORDER BY letter, number

您可以包含ORDER BY子句。返回的行集是否已排序,将为DISTINCT

答案 1 :(得分:0)

我有一个解决方案,首先找到给定数字的第一个字母,然后找到该字母的第一个标点。对于严重大小的表,您需要添加一个数字,字母索引作为最小值。

select t.number,t.letter,min(t.ascii) from 
(select number, min(letter) as first_letter from t group by number) x
inner join t on x.number = t.number and x.first_letter = t.letter
group by t.number, t.letter
order by 2,1;

小提琴:http://sqlfiddle.com/#!15/7617f/1

或者你可以使用窗口函数来完成它。

select t.number,
min(t.letter),
first_value(min(t.ascii)) over (partition by t.number, min(t.letter)) from t
group by t.number
order by 2,1;

http://sqlfiddle.com/#!15/d3b3d/1