将该组中的单元格值与最大值进行比较,出现错误 SELECT 失败 3707
Compare Cell value with Max in that group getting error SELECT Failed 3707
我试图将单元格值与视图中该组中的最大值进行比较,但它抛出了一个错误。
内部查询运行良好,它为我提供了一份患者名单、他们的适应症以及 2017 年和 3 年索赔的数量。在外部查询中,我只需要保持耐心,只需要保持 2017 年索赔 >0 并且在 3 年内拥有最大索赔的适应症。
这里是代码抛出错误的地方
SELECT patient_id,
CASE
WHEN Count(patient_id) = 1 THEN diagnosis_grouping
WHEN claim_2017 > 0
AND claims_3yr = Max(claims_3yr) THEN diagnosis_grouping
ELSE NULL
END AS INDICATION
FROM (SELECT patient_id,
diagnosis_grouping,
Sum (CASE
WHEN LEFT(service_date, 4) = '2017' THEN 1
ELSE 0
END) AS CLAIM_2017,
Count(DISTINCT claim_id) AS CLAIMS_3YR,
Max(Cast(service_date AS DATE)) AS LATEST_CLAIM
FROM l01_dx_claims A
INNER JOIN diagnosis_code_imm B
ON A.diagnosis_code = B.diagnosis_code
GROUP BY 1,
2
HAVING Count (DISTINCT claim_id) > 1
AND Sum(CASE
WHEN Cast(LEFT(service_date, 4) AS INT) = 2017 THEN 1
ELSE 0
END) > 0
ORDER BY Cast(patient_id AS INT),
diagnosis_grouping)
GROUP BY patient_id
问题出现在这里:
WHEN Count(patient_id) = 1 THEN diagnosis_grouping
WHEN claim_2017 > 0
AND claims_3yr = Max(claims_3yr) THEN diagnosis_grouping
ELSE NULL
Count(patent_id) 是聚合,而 claim_2017 不是。
所以你的 group by 语句对于这个查询是低效的。您要么需要将 claim_2017 添加到您的组中,要么找到其他解决方案。
考虑两个聚合级别的多个 CTE:
WITH agg1 AS
(SELECT patient_id,
diagnosis_grouping,
Sum (CASE
WHEN LEFT(service_date, 4) = '2017'
THEN 1
ELSE 0
END) AS CLAIM_2017,
Count(DISTINCT claim_id) AS CLAIMS_3YR,
Max(Cast(service_date AS DATE)) AS LATEST_CLAIM
FROM l01_dx_claims A
INNER JOIN diagnosis_code_imm B
ON A.diagnosis_code = B.diagnosis_code
GROUP BY 1,
2
HAVING Count (DISTINCT claim_id) > 1
AND Sum(CASE
WHEN Cast(LEFT(service_date, 4) AS INT) = 2017
THEN 1
ELSE 0
END) > 0
),
agg2 AS
(SELECT patient_id,
COUNT(patient_id) AS patient_count,
MAX(CLAIMS_3YR) AS max_claims_3yr
FROM agg1
GROUP BY patient_id)
SELECT a1.*
FROM agg1 a1
INNER JOIN agg2 a2
ON a1.patient_id = a2.patient_id
AND a1.CLAIMS_3YR = a2.max_claims_3yr
ORDER BY CAST(a1.patient_id AS INT),
a1.diagnosis_grouping
你似乎想比较不同层次的聚合,我是这样理解你的逻辑的:
SELECT patient_id,
diagnosis_grouping,
Sum (CASE
WHEN Left(service_date, 4) = '2017' THEN 1
ELSE 0
END) AS CLAIM_2017,
Count(DISTINCT claim_id) AS CLAIMS_3YR,
Max(Cast(service_date AS DATE)) AS LATEST_CLAIM
FROM l01_dx_claims A
INNER JOIN diagnosis_code_imm B
ON A.diagnosis_code = B.diagnosis_code
GROUP BY 1,
2
HAVING -- Teradata allows using a Select alias in any place, simplified conditions
CLAIMS_3YR > 1
AND CLAIM_2017 > 0
QUALIFY -- using Windowed Aggregates to filter the correct result
Count(*) -- only a single diagnosis_grouping
Over (PARTITION BY patient_id) = 1
OR ( -- there was a claim in 2017
Max(claim_2017)
Over (PARTITION BY patient_id) > 0
AND -- diagnosis_grouping with the higthest count
Row_Number()
Over(PARTITION BY patient_id
ORDER BY claims_3yr DESC ) = 1
)
我试图将单元格值与视图中该组中的最大值进行比较,但它抛出了一个错误。
内部查询运行良好,它为我提供了一份患者名单、他们的适应症以及 2017 年和 3 年索赔的数量。在外部查询中,我只需要保持耐心,只需要保持 2017 年索赔 >0 并且在 3 年内拥有最大索赔的适应症。
这里是代码抛出错误的地方
SELECT patient_id,
CASE
WHEN Count(patient_id) = 1 THEN diagnosis_grouping
WHEN claim_2017 > 0
AND claims_3yr = Max(claims_3yr) THEN diagnosis_grouping
ELSE NULL
END AS INDICATION
FROM (SELECT patient_id,
diagnosis_grouping,
Sum (CASE
WHEN LEFT(service_date, 4) = '2017' THEN 1
ELSE 0
END) AS CLAIM_2017,
Count(DISTINCT claim_id) AS CLAIMS_3YR,
Max(Cast(service_date AS DATE)) AS LATEST_CLAIM
FROM l01_dx_claims A
INNER JOIN diagnosis_code_imm B
ON A.diagnosis_code = B.diagnosis_code
GROUP BY 1,
2
HAVING Count (DISTINCT claim_id) > 1
AND Sum(CASE
WHEN Cast(LEFT(service_date, 4) AS INT) = 2017 THEN 1
ELSE 0
END) > 0
ORDER BY Cast(patient_id AS INT),
diagnosis_grouping)
GROUP BY patient_id
问题出现在这里:
WHEN Count(patient_id) = 1 THEN diagnosis_grouping
WHEN claim_2017 > 0
AND claims_3yr = Max(claims_3yr) THEN diagnosis_grouping
ELSE NULL
Count(patent_id) 是聚合,而 claim_2017 不是。
所以你的 group by 语句对于这个查询是低效的。您要么需要将 claim_2017 添加到您的组中,要么找到其他解决方案。
考虑两个聚合级别的多个 CTE:
WITH agg1 AS
(SELECT patient_id,
diagnosis_grouping,
Sum (CASE
WHEN LEFT(service_date, 4) = '2017'
THEN 1
ELSE 0
END) AS CLAIM_2017,
Count(DISTINCT claim_id) AS CLAIMS_3YR,
Max(Cast(service_date AS DATE)) AS LATEST_CLAIM
FROM l01_dx_claims A
INNER JOIN diagnosis_code_imm B
ON A.diagnosis_code = B.diagnosis_code
GROUP BY 1,
2
HAVING Count (DISTINCT claim_id) > 1
AND Sum(CASE
WHEN Cast(LEFT(service_date, 4) AS INT) = 2017
THEN 1
ELSE 0
END) > 0
),
agg2 AS
(SELECT patient_id,
COUNT(patient_id) AS patient_count,
MAX(CLAIMS_3YR) AS max_claims_3yr
FROM agg1
GROUP BY patient_id)
SELECT a1.*
FROM agg1 a1
INNER JOIN agg2 a2
ON a1.patient_id = a2.patient_id
AND a1.CLAIMS_3YR = a2.max_claims_3yr
ORDER BY CAST(a1.patient_id AS INT),
a1.diagnosis_grouping
你似乎想比较不同层次的聚合,我是这样理解你的逻辑的:
SELECT patient_id,
diagnosis_grouping,
Sum (CASE
WHEN Left(service_date, 4) = '2017' THEN 1
ELSE 0
END) AS CLAIM_2017,
Count(DISTINCT claim_id) AS CLAIMS_3YR,
Max(Cast(service_date AS DATE)) AS LATEST_CLAIM
FROM l01_dx_claims A
INNER JOIN diagnosis_code_imm B
ON A.diagnosis_code = B.diagnosis_code
GROUP BY 1,
2
HAVING -- Teradata allows using a Select alias in any place, simplified conditions
CLAIMS_3YR > 1
AND CLAIM_2017 > 0
QUALIFY -- using Windowed Aggregates to filter the correct result
Count(*) -- only a single diagnosis_grouping
Over (PARTITION BY patient_id) = 1
OR ( -- there was a claim in 2017
Max(claim_2017)
Over (PARTITION BY patient_id) > 0
AND -- diagnosis_grouping with the higthest count
Row_Number()
Over(PARTITION BY patient_id
ORDER BY claims_3yr DESC ) = 1
)