簡體   English   中英

如何使此子查詢更有效?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM