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