【问题标题】:SQL Server - Need to obtain duplicate records based on mutiple criteria of the same columnSQL Server - 需要根据同一列的多个条件获取重复记录
【发布时间】:2013-12-11 23:03:58
【问题描述】:

我使用庞大的医院活动记录数据集。每条记录都代表代表患者所做的事情。我的重点是经历过“门诊”活动的患者,例如参加预约或诊所。 在数据中,我们得到重复的记录;患者被证明在六个月内参加过一次以上的首次门诊预约。这是发送数据的医院的错误。我们必须确定这些记录才能作为挑战发回。

我有以下 SQL 语句,它正在查找“Patient Code”多次出现的记录。

SELECT * FROM dbo.Z_ForQueries a
JOIN (SELECT PatientCode
FROM dbo.Z_ForQueries
GROUP BY PatientCode
HAVING COUNT (*) > 1 ) b
ON a.PatientCode = b.PatientCode
WHERE [Multiple OPFA in month] = 'y'

我终其一生都无法弄清楚下一位的语法;对于每组重复的患者代码,我只想查看其中一个记录的“月份”为 7 的记录(这就是我正在处理的当前月份)。如果当月没有一组重复记录有“7”,那么我不需要查看它们。

例如,患者代码 L000066715 有 4 条记录,我可以看到每条记录代表同一医院专科的同一初次门诊预约。显然你只能“第一次参加”一次。每条记录都有一个月号; 3、4、6 和 7。由于此患者代码在第 7 个月有一条重复记录,因此我需要将其与其他 3 条记录一起返回到结果中。

其他患者代码存在重复,但他们的记录都不是从第 7 个月开始的,因此不需要返回。

我希望我已经正确设置了场景以寻求帮助!谢谢。

【问题讨论】:

  • 这是 TSQL 吗? PL/SQL? MySQL?

标签: sql sql-server duplicates


【解决方案1】:

这样的事情应该可以工作:

SELECT  * 
FROM    dbo.Z_ForQueries a
JOIN (
    SELECT   PatientCode,
             MAX(CASE WHEN MONTH(dateColumn) = 7 THEN 1 ELSE 0 END) As InMonth
    FROM     dbo.Z_ForQueries
    GROUP BY PatientCode
    HAVING   COUNT (*) > 1 
     ) b    ON  a.PatientCode = b.PatientCode
            And InMonth = 1
WHERE [Multiple OPFA in month] = 'y'

解释:

对于 Month=7 的行,CASE 表达式返回 1,在所有其他情况下返回 0。因此,如果 GROUP 中的 any 行的 Month=7,则此 CASE 表达式周围的 MAX(..) 返回 1,仅当 none 行有 0 时才返回 0。 p>

【讨论】:

  • 哎呀,错过了时限,意思是说;谢谢@RBarryYoung。它让我更接近了一点。正如我忘记提及的那样,我调整了 MAX 语句,我的月份列不是日期时间,它包含代表月份的整数。结果数量减少了大约一半,但它仍然给我提供了重复的患者代码在其中一个重复项上没有月份“7”的记录。因为我不完全理解 MAX 语句对子 CASE 语句的作用,所以我在这里的重量超过了我的体重。学习曲线!!
  • @steveck79 解释附加到我的答案。
  • 啊,我的理解扩展了!谢谢。我已经删除了 WHERE 子句,因为您所做的非常有帮助的事情是让我走上一条不需要使用一整块先前处理的路径,这些处理使列与 'y's 开始有关。希望不需要它真是太好了。我现在试图弄清楚为什么查询将“1”分配给没有月份“7”的[患者代码]记录。以木换树之类的!
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多