【问题标题】:Group By 2 columns and Count then Sort the count for each key pair按 2 列分组并计数,然后对每个密钥对的计数进行排序
【发布时间】:2020-05-05 23:44:19
【问题描述】:

很可能这个问题已经得到解答,但我并没有真正找到解决方案:

我有这样的事情:

使用这个查询:

SELECT
   deparment,
   device,
   count(*) as times 
FROM
   routines
GROUP BY
   device,
   deparment
ORDER BY
   times DESC;

The result would come like this:

3   "A" 7337
2   "A" 5875
1   "A" 3242
3   "B" 1937
2   "B" 1866
3   "C" 1609
1   "B" 1580
3   "D" 1493

但我想按每个设备排序,所以输出应该是这样的:

3   "A" 7337
2   "A" 5875
1   "A" 3242
3   "B" 1937
2   "B" 1866
1   "B" 1580
3   "C" 1609
3   "D" 1493

所以计数字段应该从多到少排序,但必须按每个设备分组

【问题讨论】:

    标签: mysql sql postgresql


    【解决方案1】:

    我认为您需要两个排序键:

    ORDER BY device, times DESC;
    

    如果你也想对设备进行排序,所以最大的设备在前,你可以使用窗口函数:

    ORDER BY sum(times) over (partition by device) DESC, device, times DESC
    

    【讨论】:

    • 是的,它确实对设备列和计数进行了分组,但时间列未排序,因此第一个部门、设备、时间设置不是具有最大时间的那个 发生这种情况:@ 987654323@, 3 "X" 57 , 2 "X" 23 , 3 "J" 1 , 2 "T" 2171 ,
    • @vml11 。 . .这按设计排序,然后 times 降序排列,这似乎是您所要求的。
    • 您的顺序完全正确,这正是我的目标,但显示的数据显示未排序的时间,它不会按时间对整个结果进行排序,从“次数最多”的行开始”。能做到吗?
    • 完全正确!非常感谢,我不知道 over 和 partition 我将查看有关它的文档以了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多