Sottraendo colonne da query BigQuery separate

Sep 10 2020

Ho due query BigQuery separate in cui ho preso la somma dei casi confermati per una certa data e li ho raggruppati per regione e ordinati in ordine decrescente per casi.

SELECT region, SUM(confirmed_cases) AS total_cases FROM provincedata WHERE date BETWEEN '2020-08-01' AND '2020-08-02' GROUP BY region ORDER BY total_cases DESC
SELECT region, SUM(confirmed_cases) AS total_cases FROM provincedata WHERE date BETWEEN '2020-08-31' AND '2020-09-01' GROUP BY region ORDER BY total_cases DESC

Voglio calcolare la differenza tra total_casesla prima e la seconda query e raggruppare e ordinare per regione e in ordine decrescente in base alla differenza in ordine decrescente.

Risposte

1 MikhailBerlyant Sep 10 2020 at 19:19

Di seguito è riportato per BigQuery Standard SQL

Il modo più semplice è riutilizzare le query con cui ti senti già a tuo agio (invece di riscrivere cose)

#standardSQL
WITH `project.dataset.query1` AS (
  SELECT region, SUM(confirmed_cases) AS total_cases 
  FROM provincedata 
  WHERE DATE BETWEEN '2020-08-01' AND '2020-08-02' 
  GROUP BY region 
), `project.dataset.query2` AS (
  SELECT region, SUM(confirmed_cases) AS total_cases 
  FROM provincedata 
  WHERE DATE BETWEEN '2020-08-31' AND '2020-09-01' 
  GROUP BY region 
)
SELECT region, q1.total_cases - q2.total_cases AS total_cases_difference
FROM `project.dataset.query1` q1 
JOIN `project.dataset.query2` q2
USING(region)
ORDER BY total_cases_difference DESC
GMB Sep 10 2020 at 19:36

Questo potrebbe essere espresso in modo più efficiente con l'aggregazione condizionale:

select
    region,
    sum(case when date between '2020-08-01' and '2020-08-02' then confirmed_cases else 0 end) total_cases_1,
    sum(case when date between '2020-08-31' and '2020-09-02' then confirmed_cases else 0 end) total_cases_2,
    sum(case when date between '2020-08-01' and '2020-08-02' then confirmed_cases else - confirmed_cases end) diff
from provincedata
where 
    date between '2020-08-01' and '2020-08-02'
    or date between '2020-08-31' and '2020-09-01' 
group by region
order by diff desc