如何提高此子查询的效率?

时间:2016-10-04 00:44:14

标签: sql google-bigquery

我一直在学习更多关于使我的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。我认为,因为我在同一个表上做一个子查询,所以我可以把它包装成一个查询。

2 个答案:

答案 0 :(得分:1)

我认为这可能会做你想要的:

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;

也就是说,选择自2016-01-01以来某个时间有记录的cnumber,并且在指定的其他时间段内没有记录。

这是否更快,我不知道。你必须尝试一下。

答案 1 :(得分:1)

for BigQuery(Legacy 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