使用having语句来帮助处理SQL数据

问题描述 投票:0回答:1

下面的代码(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 医院
sql databricks data-wrangling having databricks-sql
1个回答
0
投票
  1. cte 计算每个 zip5 的每个设施类型的计数
  2. 然后过滤掉任何facility_type计数大于1的zip5
  3. 接下来,选择 zip5 不在过滤列表中的记录,确保仅包含每个facility_type 为 1 或更少的 zip5(包含 10003、10025 和 10029,而排除 10016 和 10021)

-- 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
© www.soinside.com 2019 - 2024. All rights reserved.