获取具有与特定模式匹配的连接列的行

Posted

技术标签:

【中文标题】获取具有与特定模式匹配的连接列的行【英文标题】:Get rows with joined column matching a specific pattern 【发布时间】:2015-03-31 16:49:59 【问题描述】:

好的 - 我有一个带有声明 ID 和过程代码混合的表 - 我需要做的是隔离仅存在以 8 开头的过程代码的声明 ID - 所以在下面,我需要能够只抓取那些带有 claimID 的记录,其中存在 claimID LIKE '8%' 代码 - 没有其他 procedureCodes 等 - 所以只有下面的 2 和 3 个 claimID

    claimID procedureCode
    1       85025
    1       97110
    2       85025
    2       80102
    3       87112
    3       81020

如果有任何以不同数字开头的索赔记录,我想排除索赔 ID。

【问题讨论】:

使用 WHERE NOT EXISTS 子句。 claimID,其中所有 procedureCode 都以 '8' 开头? 1 85025 记录呢? @JoelCoehoorn,它会被排除,因为 ID 1 也有一个以 9 开​​头的过程代码 想一边编辑主题行吗? :) 充其量只是误导。 【参考方案1】:
SELECT DISTINCT yt1.ClaimID
    FROM YourTable yt1
    WHERE yt1.procedureCode LIKE '8%'
        AND NOT EXISTS (SELECT 1
                            FROM YourTable yt2
                            WHERE yt2.ClaimID = yt1.ClaimID
                                AND yt2.procedureCode NOT LIKE '8%');

【讨论】:

【参考方案2】:

我们分三步完成。第一步是查找不符合“无其他前导数字”要求的记录。第二步是查找满足“必须以 8 开头”要求的记录。第三步是将这两个集合与exclusion join 进行匹配,这样我们就可以从步骤 2 中获取集合,并从步骤 1 中排除集合:

我们还需要知道procedureCode 列的数据类型。了解一点CPT codes,我希望char(5) 或类似是最合适的选择,具体取决于您如何处理修饰符。如果这是您存储它的方式,那么这应该可以工作:

With BadClaims As ( --Step 1
  SELECT distinct ClaimID
  FROM [Table]
  WHERE procedureCode NOT LIKE '8%'
), GoodClaims AS ( --Step 2
  SELECT distinct ClaimID
  FROM [Table]
  WHERE procedureCode LIKE '8%'
)
SELECT g.ClaimID --Step 3
FROM GoodClaims g
LEFT JOIN BadClaims b on b.ClaimID = g.ClaimID
WHERE b.ClaimID IS NULL

但是,您可能已将其存储为整数/数字字段。如果是这种情况,这应该可行:

With BadClaims As ( --Step 1
  SELECT distinct ClaimID
  FROM [Table]
  WHERE procedureCode < 80000 or procedureCode >= 90000
), GoodClaims AS ( --Step 2
  SELECT distinct ClaimID
  FROM [Table]
  WHERE procedureCode LIKE >= 80000 and procedureCode < 90000
)
SELECT g.ClaimID --Step 3
FROM GoodClaims g
LEFT JOIN BadClaims b on b.ClaimID = g.ClaimID
WHERE b.ClaimID IS NULL

这是一个很长的表格,用来解释这里发生了什么。您还可以将这些步骤简化为单个自联接:

SELECT distinct t1.claimID 
FROM [Table] t1
LEFT JOIN [Table] t2 ON t2.claimID = t1.ClaimID and t2.procecureCode NOT LIKE '8%'
WHERE t1.procedureCode LIKE '8%' and t2.claimID IS NULL 

【讨论】:

他不想要claimID 1,只想要那些只有procedureCodes 以'8' 开头的那些。 ClaimID 1 有一个以“9”开头的procedureCode 可能希望在您的第二个代码示例中编辑此行:WHERE ClaimID LIKE >= 80000 和 ClaimID

以上是关于获取具有与特定模式匹配的连接列的行的主要内容,如果未能解决你的问题,请参考以下文章

如何连接匹配模式的行?

MySQL选择其他表中没有匹配列的行

使用sed替换具有匹配模式的行

在 oracle 数据库的所有表中更新与特定模式匹配的列

我如何 git 只添加与模式匹配的行?

获取与模式匹配的所有 JSON 键