按一列分组,与第二列汇总,显示其他列?

时间:2020-10-07 20:47:32

标签: sql sql-server group-by

我想我希望拥有this,但对于SQL Server。

我有一个表records,其中有列namelast_modified,然后是monthprice

我想按name分组并与MAX(last_modified)聚合,但是我还想显示与所选行相对应的monthprice(由MAX()函数)。我不想按monthprice进行分组,因为它们也可能有所不同,但是同时我不能在不将它们包含在group by子句中的情况下将它们放入选择中。

现在我正试图提出这样的东西:

SELECT name, last_modified, month, price
FROM schema.records 
WHERE (name, last_modified) IN 
(
    SELECT name, MAX(last_modified)
    FROM schema.records 
    WHERE month='JANUARY'
    GROUP BY name
)

非常感谢您的帮助

3 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您正在寻找

select name, max(last_modified) over(partition by name) last_modified, 
   month,
   price
from schema.records
where ....

答案 1 :(得分:0)

只需使用相关的子查询:

SELECT r.name, r.last_modified, r.month, r.price
FROM schema.records r
WHERE r.last_modified = (SELECT name, MAX(r2.last_modified)
                         FROM schema.records r2
                         WHERE r2.month = 'JANUARY' AND r2.name = r.name
                        );

答案 2 :(得分:0)

您可以使用窗口功能执行以下操作-

Select
    name,
    month,
    Price,
    Last_modified
From
    (SELECT 
          name, 
          month,
          price,
          last_modified,
          row_number() over(partition by name order by last_modified desc) as seq_num
          FROM schema.records 
         WHERE month= 'JANUARY') T
 where T.seq_num = 1;

此外,在您的问题中,您表示希望在SQL Server中完成类似MySQL group_concat的操作。好吧,实际上可以做到。请参阅下面的内容。

SELECT 
          name, 
          max(last_modified),
          array_to_string(array_agg(month), ',') as month_list,
          array_to_string(array_agg(price), ',') as price_list
          FROM schema.records 
         WHERE month= 'JANUARY'
       Group by name;