我想我希望拥有this,但对于SQL Server。
我有一个表records
,其中有列name
,last_modified
,然后是month
和price
。
我想按name
分组并与MAX(last_modified)
聚合,但是我还想显示与所选行相对应的month
和price
(由MAX()函数)。我不想按month
和price
进行分组,因为它们也可能有所不同,但是同时我不能在不将它们包含在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
)
非常感谢您的帮助
答案 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;