Select每隔一秒记录一次,然后确定最早的日期
Select every second record then determine earliest date
我有 table 如下所示
我必须 select 每个 PatientID 的第二条记录会给出以下结果(我上次查询 return 这个结果)
然后我必须 select 最旧日期的记录如下(这是我想要的最终结果)
到目前为止我所做的:我有一个 CTE 可以获取我需要的所有数据
WITH cte
AS
(
SELECT visit.PatientTreatmentVisitID, mat.PatientMatchID,pat.PatientID,visit.RegimenDate AS VisitDate,
ROW_NUMBER() OVER(PARTITION BY mat.PatientMatchID, pat.PatientID ORDER BY visit.VisitDate ASC) AS RowNumber
FROM tblPatient pat INNER JOIN tblPatientMatch mat ON mat.PatientID = pat.PatientID
LEFT JOIN tblPatientTreatmentVisit visit ON visit.PatientID = pat.PatientID
)
然后我针对 CTE 编写查询,但到目前为止我只能 return 每个 patientID 的第二行
SELECT *
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate, RowNumber FROM cte
) as X
WHERE RowNumber = 2
如何return 只记录最早日期的记录?是否有我可以在某处包含的 MIN() 函数?
如果我没听错的话,您可以只对现有的结果集进行排序并只保留第一行。
在标准 SQL 中,您可以使用 FETCH
子句来编写:
SELECT *
FROM (
SELECT
visit.PatientTreatmentVisitID,
mat.PatientMatchID,
pat.PatientID,
visit.RegimenDate AS VisitDate,
ROW_NUMBER() OVER(PARTITION BY mat.PatientMatchID, pat.PatientID ORDER BY visit.VisitDate ASC) AS rn
FROM tblPatient pat
INNER JOIN tblPatientMatch mat ON mat.PatientID = pat.PatientID
LEFT JOIN tblPatientTreatmentVisit visit ON visit.PatientID = pat.PatientID
) t
WHERE rn = 2
ORDER BY VisitDate
OFFSET 0 ROWS FETCH FIRST 1 ROW ONLY
此语法在 Postgres、Oracle、SQL 服务器(可能还有其他数据库)中受支持。
如果您需要从所有选定日期(每个患者 ID 的每隔一行)中获取最早的日期,那么您可以尝试 window function Min:
SELECT * FROM
(
SELECT *, MIN(VisitDate) OVER (Order By VisitDate) MinDate
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate,
RowNumber FROM cte
) as X
WHERE RowNumber = 2
) Y
WHERE VisitDate=MinDate
或者您可以使用 SELECT TOP 语句。 SELECT TOP clause
允许您限制查询结果集中返回的行数:
SELECT TOP 1 PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate FROM
(
SELECT *
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate,
RowNumber FROM cte
) as X
WHERE RowNumber = 2
) Y
ORDER BY VisitDate
为简单起见,在日期列上添加 order desc
并使用 TOP
仅获取第一行
SELECT TOP 1 *
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate, RowNumber FROM cte
) as X
WHERE RowNumber = 2
order by VisitDate desc
我有 table 如下所示
我必须 select 每个 PatientID 的第二条记录会给出以下结果(我上次查询 return 这个结果)
然后我必须 select 最旧日期的记录如下(这是我想要的最终结果)
到目前为止我所做的:我有一个 CTE 可以获取我需要的所有数据
WITH cte
AS
(
SELECT visit.PatientTreatmentVisitID, mat.PatientMatchID,pat.PatientID,visit.RegimenDate AS VisitDate,
ROW_NUMBER() OVER(PARTITION BY mat.PatientMatchID, pat.PatientID ORDER BY visit.VisitDate ASC) AS RowNumber
FROM tblPatient pat INNER JOIN tblPatientMatch mat ON mat.PatientID = pat.PatientID
LEFT JOIN tblPatientTreatmentVisit visit ON visit.PatientID = pat.PatientID
)
然后我针对 CTE 编写查询,但到目前为止我只能 return 每个 patientID 的第二行
SELECT *
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate, RowNumber FROM cte
) as X
WHERE RowNumber = 2
如何return 只记录最早日期的记录?是否有我可以在某处包含的 MIN() 函数?
如果我没听错的话,您可以只对现有的结果集进行排序并只保留第一行。
在标准 SQL 中,您可以使用 FETCH
子句来编写:
SELECT *
FROM (
SELECT
visit.PatientTreatmentVisitID,
mat.PatientMatchID,
pat.PatientID,
visit.RegimenDate AS VisitDate,
ROW_NUMBER() OVER(PARTITION BY mat.PatientMatchID, pat.PatientID ORDER BY visit.VisitDate ASC) AS rn
FROM tblPatient pat
INNER JOIN tblPatientMatch mat ON mat.PatientID = pat.PatientID
LEFT JOIN tblPatientTreatmentVisit visit ON visit.PatientID = pat.PatientID
) t
WHERE rn = 2
ORDER BY VisitDate
OFFSET 0 ROWS FETCH FIRST 1 ROW ONLY
此语法在 Postgres、Oracle、SQL 服务器(可能还有其他数据库)中受支持。
如果您需要从所有选定日期(每个患者 ID 的每隔一行)中获取最早的日期,那么您可以尝试 window function Min:
SELECT * FROM
(
SELECT *, MIN(VisitDate) OVER (Order By VisitDate) MinDate
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate,
RowNumber FROM cte
) as X
WHERE RowNumber = 2
) Y
WHERE VisitDate=MinDate
或者您可以使用 SELECT TOP 语句。 SELECT TOP clause
允许您限制查询结果集中返回的行数:
SELECT TOP 1 PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate FROM
(
SELECT *
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate,
RowNumber FROM cte
) as X
WHERE RowNumber = 2
) Y
ORDER BY VisitDate
为简单起见,在日期列上添加 order desc
并使用 TOP
仅获取第一行
SELECT TOP 1 *
FROM
(
SELECT PatientTreatmentVisitID,PatientMatchID,PatientID, VisitDate, RowNumber FROM cte
) as X
WHERE RowNumber = 2
order by VisitDate desc