簡體   English   中英

如何編寫 sql 查詢以根據年份對行進行分組

[英]How to write a sql query to group rows based on the year

在此處輸入圖像描述

上表是我從多個表中獲取的數據,我想對其進行查詢,其結果如下所示

在此處輸入圖像描述

我嘗試使用 group by 子句,但沒有達到相同的結構。 任何想法?
非常感謝

如果適合您,您可以對字符串中的值進行分組:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM