[英]How can I make this sub query more efficient?
我一直在學習有關使我的sql查詢更高效的更多信息,但是我不知道我是否在正確執行此查詢。
我正在嘗試在一個小組中找到一組,但不在另一小組中找到。 這是有效的原始查詢:
SELECT
cNumber
FROM
[dataset.table]
WHERE
DATE(date) >= '2016-01-01'
AND cNumber NOT IN (
SELECT
cNumber
FROM
[dataset.table]
WHERE
date BETWEEN DATEDIFF(CURRENT_DATE(),-5, "QUARTER")
AND DATEDIFF(CURRENT_DATE(), -1, "QUARTER"))
GROUP BY
1
當我將查詢更改為以下查詢時,將獲得大量結果:
SELECT
cNumber
FROM
dataset.table
WHERE
DATE(date) >= '2016-01-01'
AND date NOT BETWEEN DATEDIFF(CURRENT_DATE(), -5, "QUARTER")
AND DATEDIFF(CURRENT_DATE(), -1, "QUARTER")
GROUP BY
1
對於此類查詢,我是否需要包括NOT IN
子查詢,還是應該只使用第二個查詢?
我想我在第二個查詢中感到困惑,因為嘗試包括AND orderCreationDate NOT BETWEEN
。 我以為,由於我正在同一張表上執行子查詢,因此可以將其包裝到一個查詢中。
我認為這可能會滿足您的要求:
SELECT cNumber
FROM [dataset.table]
GROUP BY cnumber
HAVING MAX(DATE(date)) >= '2016-01-01' AND
SUM(CASE WHEN date BETWEEN DATEDIFF(CURRENT_DATE(), -5, "QUARTER") AND
DATEDIFF(CURRENT_DATE(), -1, "QUARTER"))
THEN 1 ELSE 0
END) = 0;
也就是說,選擇cnumber
1月1日以來某個時間有記錄且在指定的其他時間內沒有記錄的cnumber
。
我是否知道這是否更快。 您必須嘗試一下。
對於BigQuery(舊版SQL),請嘗試以下方法
SELECT cNumber
FROM [dataset.table]
GROUP BY cNumber
HAVING MAX(DATE(date)) >= '2016-01-01'
AND SUM(CASE
WHEN DATE(date) BETWEEN DATE(DATE_ADD(CURRENT_DATE(), -5, "QUARTER"))
AND DATE(DATE_ADD(CURRENT_DATE(), -1, "QUARTER"))
THEN 1 ELSE 0
END) = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.