下面的代码(Databricks SQL)生成其后面的表。我正在尝试调整此代码,以便输出仅包含 zip5 记录,这些记录只有 1 个(或更少)每个facility_type 与其关联。 Facility_type 有 4 个可能的值(Hospital、ASC、Other 和 null)。在下表中,我希望输出 zip5 (10003),因为它只有 1 个关联的设施类型。 Zip5 10016 不会输出,因为它有 2 个 Hospital 值。 Zip5 10021 有 3 个带有 Hospitalfacility_type 的值,因此也不会输出。 Zip5 10025 和 10029 都会被输出。
我尝试过使用不同的having语句,但它们都允许一些不需要的zip5潜入输出中。例如,以下语句允许 zip5 10016 进入输出。
我怎样才能实现我所需要的? having 声明不是正确的方法吗?
HAVING (COUNT(DISTINCT ok.facility_type) <= 1 and count(distinct a.org_id) <=1)
SELECT a.zip5, a.org_id, ok.facility_type
FROM sales_table a
LEFT JOIN (SELECT ok.org_id,
CASE WHEN cot.COT_DESC IN ('Outpatient') THEN 'ASC'
WHEN cot.cot_desc IN ('Hospital') THEN cot.cot_desc
ELSE 'Other'
END AS facility_type
FROM ref_table1 ok
LEFT JOIN ref_table2 cot ON ok.ID = cot.ID) ok ON a.org_id = ok.org_id
GROUP BY a.zip5, a.org_id, ok.facility_type
zip5 | org_id | 设施类型 |
---|---|---|
10003 | 845307 | 其他 |
10003 | 001564 | 医院 |
10003 | 006054 | 空 |
10016 | 932258 | 医院 |
10016 | 005484 | 医院 |
10016 | 空 | 空 |
10016 | 584790 | ASC |
10021 | 005491 | 医院 |
10021 | 005154 | 医院 |
10021 | 002166 | 医院 |
10021 | 空 | 空 |
10025 | 001565 | 医院 |
10029 | 005425 | 其他 |
10029 | 005483 | 医院 |
-- Step 1: Calculate the counts of each facility_type per zip5
WITH facility_counts AS (
SELECT
a.zip5,
ok.facility_type,
COUNT(a.org_id) AS facility_count
FROM sales_table a
LEFT JOIN (
SELECT
ok.org_id,
CASE
WHEN cot.COT_DESC IN ('Outpatient') THEN 'ASC'
WHEN cot.cot_desc IN ('Hospital') THEN cot.cot_desc
ELSE 'Other'
END AS facility_type
FROM ref_table1 ok
LEFT JOIN ref_table2 cot ON ok.ID = cot.ID
) ok ON a.org_id = ok.org_id
GROUP BY a.zip5, ok.facility_type
)
-- Step 2: Filter zip5s where any facility_type count is greater than 1
, filtered_zip5s AS (
SELECT zip5
FROM facility_counts
WHERE facility_count > 1
GROUP BY zip5
)
-- Step 3: Select zip5s that do not appear in the filtered_zip5s
SELECT a.zip5, a.org_id, ok.facility_type
FROM sales_table a
LEFT JOIN (
SELECT
ok.org_id,
CASE
WHEN cot.COT_DESC IN ('Outpatient') THEN 'ASC'
WHEN cot.cot_desc IN ('Hospital') THEN cot.cot_desc
ELSE 'Other'
END AS facility_type
FROM ref_table1 ok
LEFT JOIN ref_table2 cot ON ok.ID = cot.ID
) ok ON a.org_id = ok.org_id
WHERE a.zip5 NOT IN (SELECT zip5 FROM filtered_zip5s)
GROUP BY a.zip5, a.org_id, ok.facility_type