在Sqlite中,为不同列中返回的每个名称获取前2名
我有一个按Hipaa_Short分组的返回最近2个日期的列表。我想在一个栏目中最新的,在另一个栏目中第二个最新的,为每个Hipaa_短。有可能缺少日期,因此Hipaa_Short只有一行,在这种情况下,我希望也显示空值。我正在使用Sqlite3,所以我确信一些“花哨”的东西不会起作用在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)
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