You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PostgreSQL(DBeaver)中获取特定行及其前后行的技术需求

PostgreSQL数据查询实现方案

原始数据集

IDIdentifierAdmission_DateRelease_Date
23425/1/225/5/22
23414/25/224/30/22
23424/20/224/24/22
23424/15/224/18/22
78917/15/227/19/22
78927/8/227/14/22
78927/1/227/5/22
32126/1/216/3/21
32125/27/215/31/21
32115/20/215/26/21
32125/15/215/19/21
32125/6/215/10/21

查询需求

获取所有identifier=1的行,同时获取这些行的直接上一行或直接下一行,结果按日期从最新到最旧排序。

规则说明:

  • identifier=1的行必有下一行,可能存在上一行;
  • 若某个ID不存在identifier=1的行,则该ID的所有行不纳入结果。

预期结果

IDIdentifierAdmission DateRelease Date
23425/1/225/5/22
23414/25/224/30/22
23424/20/224/24/22
78917/15/227/19/22
78927/8/227/14/22
32125/27/215/31/21
32115/20/215/26/21
32125/15/215/19/21

解决方案(PostgreSQL SQL语句)

方案一:基于行编号筛选

通过窗口函数为每个ID的行按入院日期倒序编号,再筛选目标行及其相邻行:

WITH ranked_data AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY TO_DATE(Admission_Date, 'MM/DD/YY') DESC) AS rn,
        MAX(CASE WHEN Identifier = 1 THEN rn END) OVER (PARTITION BY ID) AS target_rn
    FROM your_table_name
)
SELECT 
    ID,
    Identifier,
    Admission_Date AS "Admission Date",
    Release_Date AS "Release Date"
FROM ranked_data
WHERE 
    (rn = target_rn OR rn = target_rn - 1 OR rn = target_rn + 1)
    AND target_rn IS NOT NULL
ORDER BY TO_DATE(Admission_Date, 'MM/DD/YY') DESC;

方案二:基于相邻行标记筛选

用LAG/LEAD窗口函数标记目标行的上下行,再过滤结果:

WITH flagged_data AS (
    SELECT 
        *,
        CASE 
            WHEN Identifier = 1 THEN 1
            WHEN LAG(Identifier) OVER (PARTITION BY ID ORDER BY TO_DATE(Admission_Date, 'MM/DD/YY') DESC) = 1 THEN 1
            WHEN LEAD(Identifier) OVER (PARTITION BY ID ORDER BY TO_DATE(Admission_Date, 'MM/DD/YY') DESC) = 1 THEN 1
            ELSE 0
        END AS is_target_related
    FROM your_table_name
),
valid_ids AS (
    SELECT DISTINCT ID FROM your_table_name WHERE Identifier = 1
)
SELECT 
    ID,
    Identifier,
    Admission_Date AS "Admission Date",
    Release_Date AS "Release Date"
FROM flagged_data
JOIN valid_ids USING (ID)
WHERE is_target_related = 1
ORDER BY TO_DATE(Admission_Date, 'MM/DD/YY') DESC;

关键注意事项

  1. 替换your_table_name为实际表名;
  2. 如果Admission_Date是字符串类型,必须用TO_DATE(Admission_Date, 'MM/DD/YY')转换为日期类型,避免字符串排序逻辑错误。

内容的提问来源于stack exchange,提问作者dbeavernoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:54:23