首页 > 解决方案 > 在 Sqlite 中,为不同列中返回的每个名称获取前 2 个

问题描述

我有这个返回按 Hipaa_Short 分组的最近 2 个日期。对于每个 Hipaa_Short,我想要一个列中的最新消息和另一列中的第二个最新消息。有可能缺少日期(因此 Hipaa_Short 只有一行)在这种情况下,我也希望显示空值。我正在使用 Sqlite3,所以我确信一些“花哨”的东西不会起作用。

SELECT * FROM 
    (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Hipaa_Short ORDER BY Meeting_Date DESC) AS rn
    FROM Meetings
    )  
WHERE rn < 3

这是我得到的,但这不是我想要的:

 pk_id   Hipaa_Short   Meeting_Date     rn
+-------|-------------|--------------+-----+
|   2   |  LastFirst  | 2020-02-01   |  2  |
|   5   |  LastFirst  | 2020-03-01   |  1  |
|   6   |  JoneBob    | 2020-03-01   |  2  |
|   7   |  JoneBob    | 2020-04-01   |  1  |
|   8   |  JonesTom   | 2020-06-01   |  2  |
|   9   |  JonesTom   | 2020-07-01   |  1  |
|   10  |  NortEdw    | 2020-04-01   |  1  |
+-------|-------------|--------------+-----+

会议桌:

REATE TABLE "Meetings" (
    "id_pk" INTEGER NOT NULL,
    "Hipaa_Short"   TEXT NOT NULL,
    "Meeting_Date"  TEXT NOT NULL,
    "MTG_Year"  INTEGER,
    "MTG_Month" INTEGER,
    "MTG_Day"   INTEGER,
    "CN_Date"   TEXT,
    "Meeting_Type"  TEXT,
    "Date_Added"    TEXT,
    "Annual"    TEXT,
    "LOCSI_Flag"    TEXT,
    "Hipaa_RID" TEXT,
    PRIMARY KEY("id_pk"),
    UNIQUE("Hipaa_Short","Meeting_Date")
)

样本数据:

 pk_id   Hipaa_Short   Meeting_Date 
+-------|-------------|--------------+
|   1   |  LastFirst  | 2020-01-01   | 
|   2   |  LastFirst  | 2020-02-01   | 
|   3   |  JoneBob    | 2020-02-01   | 
|   4   |  JonesTom   | 2020-02-01   | 
|   5   |  LastFirst  | 2020-03-01   | 
|   6   |  JoneBob    | 2020-03-01   | 
|   7   |  JoneBob    | 2020-04-01   | 
|   8   |  JonesTom   | 2020-06-01   | 
|   9   |  JonesTom   | 2020-07-01   | 
|   10  |  NortEdw    | 2020-04-01   |  
+-------|-------------|--------------+

期望的输出:

  Hipaa_Short   Prior Date   Next Date  
+-------------|------------+------------+
|  LastFirst  | 2020-02-01 | 2020-03-01 |
|  JoneBob    | 2020-03-01 | 2020-04-01 |
|  JonesTom   | 2020-06-01 | 2020-07-01 |
|  NortEdw    |            | 2020-04-01 |
+-------------|------------|------------+

标签: sqlsqlitepivotgreatest-n-per-groupwindow-functions

解决方案


对于这个特定问题,GMB 的答案略短一些:

select hipaa_short, min(meeting_date) as prior_date, max(meeting_date) as next_date
from (select m.*, 
             row_number() over (partition by hipaa_short order by meeting_date desc) as rn
      from meetings m
     ) m
where rn <= 2
group by hipaa_short

推荐阅读