在Sqlite中,为不同列中返回的每个名称获取前2名

在Sqlite中,为不同列中返回的每个名称获取前2名,sql,sqlite,pivot,greatest-n-per-group,window-functions,Sql,Sqlite,Pivot,Greatest N Per Group,Window Functions,我有一个按Hipaa_Short分组的返回最近2个日期的列表。我想在一个栏目中最新的,在另一个栏目中第二个最新的,为每个Hipaa_短。有可能缺少日期,因此Hipaa_Short只有一行,在这种情况下,我希望也显示空值。我正在使用Sqlite3,所以我确信一些“花哨”的东西不会起作用 SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Hipaa_Short ORDER BY Meeting_Date DESC)

我有一个按Hipaa_Short分组的返回最近2个日期的列表。我想在一个栏目中最新的,在另一个栏目中第二个最新的,为每个Hipaa_短。有可能缺少日期,因此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
会议桌:

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 |
+-------------|------------|------------+

您可以在现有查询的基础上使用条件聚合来透视结果集:

select 
    hipaa_short,
    max(case when rn = 2 then meeting_date end) prior_date,
    max(case when rn = 1 then meeting_date end) 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

您可以在现有查询的基础上使用条件聚合来透视结果集:

select 
    hipaa_short,
    max(case when rn = 2 then meeting_date end) prior_date,
    max(case when rn = 1 then meeting_date end) 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

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

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

由于您已经需要对分区进行排序以仅获取第一个分区,因此使用lead window函数将两个日期都获取到一行中,而无需进行额外的聚合,这样做既简单又高效:

WITH cte AS
  (SELECT Hippa_Short
        , lead(Meeting_Date) OVER w AS "Prior Date"
        , Meeting_Date AS "Next Date"
        , row_number() OVER w AS rn
   FROM meetings
   WINDOW w AS (PARTITION BY Hippa_Short ORDER BY Meeting_Date DESC))
SELECT Hippa_Short, "Prior Date", "Next Date"
FROM cte
WHERE rn = 1;
给予

Hippa_短前一天下一天 ------ ----- ----- JoneBob 2020-03-01 2020-04-01 琼斯通2020-06-01 2020-07-01 最后一次2020-02-01 2020-03-01 北纬2020-04-01
由于您已经需要对分区进行排序以仅获取第一个分区,因此使用lead window函数将两个日期都获取到一行中,而无需进行额外的聚合,这样做既简单又高效:

WITH cte AS
  (SELECT Hippa_Short
        , lead(Meeting_Date) OVER w AS "Prior Date"
        , Meeting_Date AS "Next Date"
        , row_number() OVER w AS rn
   FROM meetings
   WINDOW w AS (PARTITION BY Hippa_Short ORDER BY Meeting_Date DESC))
SELECT Hippa_Short, "Prior Date", "Next Date"
FROM cte
WHERE rn = 1;
给予

Hippa_短前一天下一天 ------ ----- ----- JoneBob 2020-03-01 2020-04-01 琼斯通2020-06-01 2020-07-01 最后一次2020-02-01 2020-03-01 北纬2020-04-01