簡體   English   中英

水平選擇每個組的第一條記錄和最后一條記錄

[英]select first and last record of each group horizontally

我有一張桌子 在此處輸入圖片說明

我想通過facility_id和created_at選擇每個組的第一條記錄和最后一條記錄,需要水平輸出。 我可以垂直做,但水平需要 在此處輸入圖片說明

with CTE as (
  select 
  *
  ,ROW_NUMBER() over (partition by facility_id,name order by created_at asc ) ascrnk
  ,ROW_NUMBER() over (partition by facility_id,name order by created_at desc ) desrnk
  from TestTable
)
select T1.facility_id,T1.name,
  T1.value as "First_value",
  T1.created_at as "First created_at",
  T2.value as "Last_value",
  T2.created_at as "Last created_at"  
from (
  select * from cte
  where ascrnk = 1
) T1
left join (
  select * from cte
  where desrnk = 1 
) T2 on T1.facility_id = T2.facility_id and T1.name = T2.name

結果:

| facility_id | name | First_value |     First created_at | Last_value |      Last created_at |
|-------------|------|-------------|----------------------|------------|----------------------|
|        2011 |    A |         200 | 2015-05-30T11:50:17Z |        300 | 2017-05-30T11:50:17Z |
|        2012 |    B |         124 | 2015-05-30T11:50:17Z |        195 | 2017-05-30T11:50:17Z |
|        2013 |    C |         231 | 2015-05-30T11:50:17Z |        275 | 2017-06-30T11:50:17Z |
|        2014 |    D |         279 | 2017-06-30T11:50:17Z |        263 | 2018-06-30T11:50:17Z |

SQL小提琴演示鏈接

我認為使用窗口函數並select distinct要簡單得多:

select distinct facility_id, name,
       first_value(value) over (partition by facility_id, name order by created_at asc) as first_value,
       min(created_at) as first_created_at,
       first_value(value) over (partition by facility_id, name order by created_at desc) as last_value,
       max(created_at) as last_created_at
from t;

沒有子查詢。 沒有加入。

您還可以通過group by使用數組來實現相同的功能。 遺憾的是,SQL Server不直接將first_value()作為窗口函數支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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