Считать отдельные и тематические проблемы - PullRequest
0 голосов
/ 28 октября 2019

Я воспроизвел проблему с живыми данными на Snowflake demo db. case "Mark 1" оценивается как NULL (это нормально). Я предполагаю, что счетчик, отличный от этого условия («Отметка 2») должен возвращать 0, но он возвращает 1. Нет разницы между счетом и счетчиком.

Чего мне не хватает? Почему в этом случае ноль считается?

Код:

WITH _table1 as(
    SELECT 
        O_CUSTKEY,
        COUNT(DISTINCT CASE WHEN O_TOTALPRICE>=50000 AND O_TOTALPRICE<100000 THEN O_ORDERKEY END) AS NO_SALES_OVER_50_TO_100,
        COUNT(DISTINCT CASE WHEN O_TOTALPRICE>=100000 THEN O_TOTALPRICE END) AS NO_SALES_OVER_100
    FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
    GROUP BY 1
)
SELECT 
    O_CUSTKEY,
    CASE WHEN NO_SALES_OVER_50_TO_100>0 THEN O_CUSTKEY END, --Mark 1
    COUNT(DISTINCT CASE WHEN NO_SALES_OVER_50_TO_100>0 THEN O_CUSTKEY end) --Mark 2
FROM _table1
WHERE O_CUSTKEY=8117
GROUP BY 1,2

1 Ответ

0 голосов
/ 28 октября 2019

Это похоже на ошибку, потому что, если проверить случаи с простой логикой, вы получите 0 для оценки 2

WITH table1 as (
    SELECT 
        100 as column1,
        --0 as column2
        COUNT(DISTINCT CASE WHEN O_TOTALPRICE>=50000 AND O_TOTALPRICE<100000 THEN O_ORDERKEY END) as column2
    FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
    WHERE O_CUSTKEY = 8117
    GROUP BY 1
)
select column1, column2,
    case when column2 >0 then column1 end as mark1,
    count(distinct mark1) as mark2
FROM table1
WHERE column1 = 100
group by 1,2;

дает

COLUMN1 COLUMN2 MARK1   MARK2
100     0       NULL    1

были

WITH table1 as (
    SELECT 
        100 as column1,
        0 as column2
        --COUNT(DISTINCT CASE WHEN O_TOTALPRICE>=50000 AND O_TOTALPRICE<100000 THEN O_ORDERKEY END) as column2
    FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
    WHERE O_CUSTKEY = 8117
    GROUP BY 1
)
select column1, column2,
    case when column2 >0 then column1 end as mark1,
    count(distinct mark1) as mark2
FROM table1
WHERE column1 = 100
group by 1,2;

дает

COLUMN1 COLUMN2 MARK1   MARK2
100     0       NULL    0

Таким образом, вы должны отправить его в снежинку как ошибку.

...