我有以下Postgres SQL查询:
SELECT movement_id, counter, MAX(standardized_output) AS standardized_output
FROM "outputs"
WHERE "outputs"."user_id" = 1 AND "outputs"."movement_id" = 1 AND (counter in (1,3,5))
GROUP BY movement_id, counter
这对我来说很好地产生了三行。
但我还想提及相关的done_at
专栏。将done_at
添加到SELECT
和GROUP_BY
最终会返回数百行;我只想要上面查询返回的三行,以及done_at
函数找到的输出行的相应MAX
字段。
答案 0 :(得分:1)
使用带有ROW_NUMBER
的CTEWITH CTE AS
(SELECT movement_id, counter, standardized_output ,done_at,
ROW_NUMBER() OVER (PARTITION BY movement_id, counter ORDER BY standardized_output DESC) as RN
FROM "outputs"
WHERE "outputs"."user_id" = 1 AND "outputs"."movement_id" = 1 AND (counter in (1,3,5))
)
SELECT * FROM CTE WHERE RN=1
答案 1 :(得分:0)
如果您希望字段done_at
具有max
值,则无需将其添加到group by
子句中,您必须使用max函数添加它,如下所示
SELECT movement_id,
counter,
MAX(standardized_output) AS standardized_output,
MAX(done_at)
FROM "outputs"
WHERE "outputs"."user_id" = 1
AND "outputs"."movement_id" = 1
AND counter in (1,3,5)
GROUP BY movement_id, counter
您可以在同一个sql上使用多个聚合列。我认为done_at
是一个日期列,因此您将获得数百行。
答案 2 :(得分:0)
考虑使用子查询派生表:
SELECT t2.movement_id, t2.counter, t2.standardized_output, t1.done_at
FROM "outputs" t1
INNER JOIN
(SELECT movement_id, counter, MAX(standardized_output) AS standardized_output
FROM "outputs"
WHERE "outputs"."user_id" = 1 AND "outputs"."movement_id" = 1
AND (counter in (1,3,5))
GROUP BY movement_id, counter) t2
ON t1.movement_id = t2.movement_id