首页 > 解决方案 > 按行排除满足特定条件的记录

问题描述

我需要一些头脑风暴。我建立了一个查询,向我展示我需要什么。但是,现在的要求是使用此记录列表并根据特定标准排除记录。

这是我当前构建的查询的输出:

Patient | Action | Date
james   | REG    | 2019/01/01
James   | CUR    | 2019/01/15
Jacon   | REG    | 2019/01/12
Jacob   | REG    | 2019/01/13
Main    | CUR    | 2019/01/01
Main    | REG    | 2019/01/05
Lucy    | REG    | 2019/01/08
Lucy    | CUR    | 2019/01/09
Lucy    | CUR    | 2019/01/10

根据上面的示例数据,我想删除第一条记录为“REG”且以下操作为“CUR”的任何患者。所以在这个例子中,我只想删除 James。

关于我应该做什么的任何想法?

感谢您的帮助!

标签: sqlsql-serverfilter

解决方案


您可以使用LEAD功能向前看。

CREATE TABLE #Patients (
    ID int IDENTITY(1,1),
    Patient varchar(50),
    [Action] varchar(50)
);

INSERT INTO #Patients (Patient, [Action])
VALUES
('james', 'REG'),
('James', 'CUR'),
('Jacon', 'REG'),
('Jacob', 'REG'),
('Main',  'CUR'),
('Main',  'REG'),
('Lucy',  'REG'),
('Lucy',  'CUR'),
('Lucy',  'CUR');

SELECT * FROM #Patients;

WITH 
    PatientWithNextAction AS (
        SELECT 
            Patient,
            [Action],
            LEAD([Action]) OVER(PARTITION BY Patient ORDER BY ID) NextAction
        FROM 
            #Patients 
    )
DELETE 
FROM 
    #Patients 
WHERE 
    Patient IN (
        SELECT
            Patient
        FROM
            PatientWithNextAction
        WHERE
            [Action] = 'REG'
            AND NextAction = 'CUR'
    );

SELECT * FROM #Patients;


DROP TABLE #Patients;

推荐阅读