如何制作一个可以在单个 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 以应用更多过滤器。
我如何创建一个 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 以应用更多过滤器。