表格排序基于特定项目的出现次数

时间:2015-06-05 03:25:26

标签: sql postgresql multiple-columns

这是一个包含2列的示例表。

 id | name
------------
  1 | hello  
  2 | hello  
  3 | hello  
  4 | hello  
  5 | world  
  6 | world  
  7 | sam  
  8 | sam  
  9 | sam  
 10 | ball  
 11 | ball  
 12 | bat  
 13 | bat  
 14 | bat  
 15 | bat  
 16 | bat 

在上表中,这里是发生次数

hello  - 4  
world  - 2  
sam    - 3  
ball   - 2  
bat    - 5

如何在psql中编写查询,以便将输出从特定名称的最大值排序到min?就像这样

bat  
bat  
bat  
bat  
bat  
hello  
hello  
hello  
hello  
sam  
sam  
sam  
ball  
ball  
world  
world

4 个答案:

答案 0 :(得分:4)

您可以使用临时表来获取所有名称的计数,然后JOIN到原始表进行排序:

SELECT yt.id, yt.name
FROM your_table yt INNER JOIN
(
    SELECT COUNT(*) AS the_count, name
    FROM your_table
    GROUP BY name
) t
ON your_table.name = t.name
ORDER BY t.the_count DESC, your_table.name DESC

答案 1 :(得分:2)

使用窗口函数的替代解决方案:

select name from table_name order by count(1) over (partition by name) desc, name;

这样可以避免在Tim的解决方案中扫描table_name两次,并且在table_name大的情况下可能会有更好的效果。

答案 2 :(得分:0)

如果原始表名为sorted:

,则可以使用时态表创建它
create temp table counted as select name, count(name) from sorting group by name;

select sorting.name from sorting, counted where sorting.name = counted.name order by count desc;

答案 3 :(得分:-1)

SELECT count( ID ) cnt, NAME
FROM table_name
GROUP BY NAME
ORDER BY count( ID ) DESC;