[英]How to enumerate a continuous group of rows based on order in result of sql query
[英]How to write a sql query to group rows based on the year
如果適合您,您可以對字符串中的值進行分組:
SELECT
id,
STRING_AGG(concat(year,': ',data_source), ', ') WITHIN GROUP (ORDER BY year) AS data_source_groupped
FROM t
GROUP BY id
ORDER BY id;
http://sqlfiddle.com/#!18/d8e6ba/12上的示例
注意:如果需要,您可以在分隔符 CHAR(13) + CHAR(10) 中使用。 </p
您需要使用解析函數、子查詢和分組方式,如下所示:
SELECT
id,
STRING_AGG(concat(year,': ',data_source), ', ') WITHIN GROUP (ORDER BY year) AS data_source_groupped
FROM (select t.id, t.datasource,
case when count(1) > 1 then concat(min(year),'-',max(year)) else min(year) end as year
from (select t.*,
sum(case when data_source = lead_Data_source then 0 else 1 end) as sm
from (select t.*,
lead(data_source) over (partition by id order by year) as lead_Data_source
from your_table t ) t) t
group by id, datasource, sm
) t
GROUP BY id
ORDER BY id;
這是一種差距和孤島問題。 最簡單的方法是減去一個常數值以獲得“相鄰”值。 以下為每個 id 和范圍返回一個單獨的行:
select id, min(year), max(year), data_source
from (select t.*,
row_number() over (partition by id, data_source order by year) as seqnum
from t
) t
group by id, (year - seqnum), data_source
order by id, min(year);
這就是我建議顯示數據的方式。 但是如果你想要一個大的連接字符串,你可以使用額外的聚合級別:
select id,
string_agg(concat(min_year, '-' + convert(varchar(255), nullif(max_year, min_year)), ': ', data_source), '
') within group (order by min_year)
from (select id, min(year) as min_year, max(year) as max_year, data_source
from (select t.*,
row_number() over (partition by id, data_source order by year) as seqnum
from t
) t
group by id, (year - seqnum), data_source
) t
group by id;
這是一個 db<>fiddle。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.