簡體   English   中英

SQL Select 計數 > 1 時的情況

[英]SQL Select Case When Count > 1

我有一張如下所示的表格。

ParentID | PersonID | Year 
----------------------------  
1             1       2019
1             2       2020
3             3       2019
3             4       2020
5             5       2019

我試圖弄清楚當 ParentID 有多個記錄時如何 select 當前的 PersonID 所以我的結果如下所示。

ParentID | PersonID | Year 
----------------------------  
1             2       2020
3             4       2020
5             5       2019

我不能 select 只是最大 PersonID,因為我們有時會創建上一年的 Person 記錄,在這種情況下 PersonID 更大,我們仍然想返回今年的記錄。 我也不能 select 基於年份,因為如果他們今年沒有記錄,我們仍然需要他們每年的最新記錄。

在這一點上,我已經嘗試以六種方式選擇這個子集,但只能讓我的大腦受傷。 任何援助將不勝感激!!

這是一個典型的每組最大 n 問題。 要解決它,您需要考慮過濾而不是聚合

一種可移植的解決方案是使用相關子查詢進行過濾,該子查詢返回每個parent_id的最新year

select t.*
from mytable t
where t.year = (
    select max(t1.year) from mytable t1 where t1.parent_id = t.parent_id
)

假設您使用的是 MSSQL,這可以通過ROW_NUMBER來實現。 您可以在此處閱讀有關ROW_NUMBER的更多信息。 PARTITION BY將結果划分為分區並將行號應用於分區。 因此,將分區應用於ParentId並按Year降序排序,數據按ParentId排序Year 然后使用RowNo = 1條件刪除舊數據。

Create Table Test(ParentId int, PersonId int, Year int);
INSERT INTO Test values 
(1, 1, 2019), 
(1, 2, 2020),
(3, 3, 2019),
(3, 4, 2020), 
(5, 5, 2019);

SELECT ParentId, PersonId, Year FROM
(
  SELECT ROW_NUMBER() OVER(PARTITION BY ParentId 
  ORDER BY Year /* Use PersonId if it fits correctly */ DESC) AS RowNo,
  ParentId, PersonId, Year from Test -- Table Name
 ) E WHERE ROWNo = 1

暫無
暫無

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

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