Посчитать по группе с условием - PullRequest
0 голосов
/ 08 октября 2019

У меня есть набор данных, как показано ниже:

  Col_A    Col_B    Col_C    Col_D     Metric_1
10/1/19        A     NULL        Z            5
10/1/19        A       AB        Z           10
10/1/19        A                 Z           12
10/1/19        B       AC        J            7
10/1/19        B       AB        J           12
10/1/19        B                 J           13

Как мне получить счетчик Col_C, если он не равен NULL или пусто ''? Мой набор данных содержит данные уровня пользователя, и я хочу в значительной степени получить счетчик, в который не включены значения NULL или Blank.

  Col_A    Col_B    Col_C    Col_D     Metric_1     COUNT_COL_C
10/1/19        A     NULL        Z            5               1 
10/1/19        A       AB        Z           10               1
10/1/19        A                 Z           12               1 
10/1/19        B       AC        J            7               2
10/1/19        B       AB        J           12               2 
10/1/19        B                 J           13               2

Моя попытка выглядит следующим образом, но она говорит, что результат для обоих - 3 вместо 1 и 2:

Dataset_Result AS (SELECT *, 
CASE WHEN COL_C IS NOT NULL AND COL_C != '' THEN COUNT(*) OVER (PARTITION BY COL_A,COL_B, COL_D) END 
COUNT_COL_C
FROM ORIGINAL_DATASET)

SELECT * FROM Dataset_Result;

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы можете переместить условие в оконную функцию:

;WITH Dataset_Result AS (
  SELECT *, 
  SUM(CASE WHEN COL_C IS NOT NULL AND COL_C != '' THEN 1 ELSE 0 END) OVER (PARTITION BY COL_A,COL_B, COL_D) 
COUNT_COL_C
FROM ORIGINAL_DATASET)

SELECT * FROM Dataset_Result;

См., Например, http://www.sqlfiddle.com/#!18/cb8e1/2.

1 голос
/ 08 октября 2019

Обычный подсчет с группировкой и никакие функции CTE или окна не должны работать для того, что, по вашему мнению, вам нужно

    SELECT Col_A, Col_B, Col_C,Col_D, Metric_1, COUNT(*) 
    FROM ORIGINAL_DATASET
    where COL_C IS NOT NULL AND COL_C != ''
    group by Col_A, Col_B, Col_C,Col_D, Metric_1
UNION 
SELECT Col_A, Col_B, Col_C,Col_D, Metric_1, COUNT(*) 
    FROM ORIGINAL_DATASET
    where COL_C IS NULL AND COL_C = ''
    group by Col_A, Col_B, Col_C,Col_D, Metric_1

РЕДАКТИРОВАТЬ1: лучший подход

SELECT  
COUNT(CASE WHEN COL_C IS NOT NULL AND COL_C != '' THEN 1 ELSE NULL END) AS COUNT_COL_C
FROM ORIGINAL_DATASET
...