SQL GROUP_BY附加列

时间:2015-08-02 08:51:52

标签: sql postgresql

我有以下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添加到SELECTGROUP_BY最终会返回数百行;我只想要上面查询返回的三行,以及done_at函数找到的输出行的相应MAX字段。

3 个答案:

答案 0 :(得分:1)

使用带有ROW_NUMBER

的CTE
WITH 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