如何制作一个可以在单个 SQL 子查询中引用先前数据条目的 SQL 层次结构

How do make a SQL hierarchy that can reference prior data entry in single SQL subquery

我如何创建一个 SQL 可以使用数据层次结构(通过数据透视数据)并构建一个可以引用回先前记录的子查询,匹配 ID。 id 可以有一个或多个评估类型,我需要检索所有 assessment_type 没有退出“6 个月重新评估”记录。如果同一个 ID 有另一个引用,比如“6 个月评估”,则跳过。我只需要在 assessment_type 字段中没有先前记录的 id 行。

数据示例如下:id,date_of_assessment,assessment_type。 创建此数据布局的 SQL 在代码示例中。

id     date-of_assessment assessment_type
1      2019-09-06         Initial
2      2019-09-06         Initial
1      2017-06-23         6-Month Reassessment
2      2017-09-01         6-Month Reassessment
3      2017-09-09         Initial
SELECT a.patid as id, date_of_assessment, 'Initial' assessment_type
  FROM cw_cans_assessment a INNER JOIN DCFS.CANS c ON c.patid = 
 a.patid
  WHERE Type_Assessment_Value = 'Initial'
UNION ALL
SELECT a.patid as id, date_of_assessment, '6-Month Reassessment' 
assessment_type
 FROM cw_cans_assessment a INNER JOIN DCFS.CANS c ON c.patid = 
a.patid
  WHERE Type_Assessment_Value = '6-Month Reassessment'
UNION ALL
    SELECT a.patid as id, date_of_assessment, 'Transition/Discharge' 
assessment_type
  FROM cw_cans_assessment a INNER JOIN DCFS.CANS c ON c.patid = 
a.patid
  WHERE Type_Assessment_Value = 'Transition/Discharge'

预期结果:将排除具有之前或之后(日期明智)的所有其他人。

id     date-of_assessment assessment_type
3      2017-09-09         Initial

我希望这个查询是你要找的:

select t1.id, t1.date_of_assessment, t1.assessment_type
from mytable t1
where t1.id not in
(
select t2.id
from mytable t2
where t2.assessment_type = '6-Month Reassessment'
)

你可以试试这个。如上面查询中所示的结果,您从上面的查询中获得了部分结果,只是结果中有一些额外的记录。

你说 "Expected result: all others that have a prior or after (date wise) will be excluded."。所以你需要一个过滤器来排除所有小于最后一个 6-Month Reassessment 记录的日期。因此,我们将您的记录分组在子查询中,并代表 date_of_assessment 过滤记录,如下所示。

SELECT  id, date_of_assessment, assessment_type FROM (
    SELECT a.patid as id, date_of_assessment, 'Initial' assessment_type
    FROM cw_cans_assessment a INNER JOIN DCFS.CANS c ON c.patid = a.patid
    WHERE Type_Assessment_Value = 'Initial'
    UNION ALL
    SELECT a.patid as id, date_of_assessment, '6-Month Reassessment' assessment_type
    FROM cw_cans_assessment a INNER JOIN DCFS.CANS c ON c.patid = a.patid
    WHERE Type_Assessment_Value = '6-Month Reassessment'
    UNION ALL
    SELECT a.patid as id, date_of_assessment, 'Transition/Discharge' assessment_type
    FROM cw_cans_assessment a INNER JOIN DCFS.CANS c ON c.patid = a.patid
    WHERE Type_Assessment_Value = 'Transition/Discharge'
) AS TAB 
WHERE TAB.Id NOT IN (SELECT a.patid FROM cw_cans_assessment a 
                     INNER JOIN DCFS.CANS c ON c.patid = a.patid
                     GROUP BY a.patid, Type_Assessment_Value HAVING COUNT(a.patid)>1 )

编辑:- 正如您所说,您要过滤所有总计数小于 2 的记录,因此我们根据个人 id 的计数过滤记录,您可以在最后更改 group by 以应用更多过滤器。