Postgres用count计数查询并希望获得最高行

时间:2018-03-07 06:19:24

标签: sql postgresql greatest-n-per-group

我有这个查询,工作正常

SELECT count(*) cnt, b.message_lot_num, 
       t.name AS trigger_name, tm.name  AS template_name 
FROM messages b 
 LEFT JOIN triggers t ON t.trigger_id = b.trigger_id 
 LEFT JOIN templates tm ON  tm.template_id = t.template_id 
WHERE b.account_id = $1 
  AND sms_direction = 'out' 
GROUP BY message_lot_num, t.name, tm.name
ORDER BY message_lot_num DESC LIMIT $2

我想做的是返回每个组的最高记录。

这些组中的每一个都是message_lot_num共享相同的消息(但由于recpt名称而略有不同,所以我不能在组中添加它)。所以我正在尝试使用该组显示示例消息

可能吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您希望获得有关哪个列或数量的最高记录?在不知道如何订购每个团体的情况下甚至提出这个问题是没有意义的。我假设您想要具有最高计数的记录:

WITH cte AS (
    SELECT
        COUNT(*) cnt,
        b.message_lot_num,
        t.name AS trigger_name
        tm.name AS template_name,
        ROW_NUMBER() OVER (PARTITION BY message_lot_num, t.name, tm.name
            ORDER BY COUNT(*) DESC) rn    -- you may order by any column here
    FROM messages b
    LEFT JOIN triggers t
        ON t.trigger_id = b.trigger_id
    LEFT JOIN templates tm
        ON tm.template_id = t.template_id
    WHERE
        b.account_id = $1 AND
        sms_direction = 'out' 
    GROUP BY
        message_lot_num, t.name, tm.name
)

SELECT
    cnt, message_lot_num, trigger_name, template_name
FROM cte
WHERE rn = 1
ORDER BY
    message_lot_num DESC;

如上文评论中所述,您可以通过调用ROW_NUMBER的任意列进行排序。我选择了伯爵,因为这似乎是最有意义的。