有没有更好的方法来编写这个 Google BigQuery?
Is there a better way to write this Google BigQuery?
我正在努力从我的数据中删除周末。 AE
和 SA
国家/地区的周末是周五和周六,其他所有国家/地区的周末是周六和周日。
这是我的数据预览,
这是我的查询尝试,
SELECT*
FROM
(SELECT
Country,
date,
FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
ORDER BY date)
WHERE
(country IN ('AE', 'SA') AND NOT (dow LIKE 'Friday' OR dow LIKE 'Saturday')) OR
country NOT IN ('AE', 'SA') AND NOT (dow LIKE 'Saturday' OR dow LIKE 'Sunday')
ORDER BY date
有没有办法存储变量,而不是在查询中列出每个国家两次?
感谢任何指导!
我发布这个答案,因为您可以对 WHERE
子句进行一些小的文体更改:
SELECT *
FROM
(
SELECT Country, date, FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
) t
WHERE
country IN ('AE', 'SA') AND dow NOT IN ('Friday', 'Saturday') OR
country NOT IN ('AE', 'SA') AND dow NOT IN ('Saturday', 'Sunday')
ORDER BY
date;
在上面,我将 LIKE
替换为 IN
,因为您似乎想使用与 dow
的相等性。此外,AND
的优先级高于 OR
,让我们去掉一些不需要的括号。
编辑:
我们甚至可以在没有任何子查询的情况下以简洁的方式编写您的查询:
SELECT Country, date, FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
WHERE
country IN ('AE', 'SA') AND FORMAT_DATE('%u', date) NOT IN (5, 6) OR
country NOT IN ('AE', 'SA') AND FORMAT_DATE('%u', date) NOT IN (6, 7)
ORDER BY
date;
一种方法是CASE
表达式:
SELECT t.*
FROM (SELECT Country, date, FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
) t
WHERE (CASE WHEN country IN ('AE', 'SA')
THEN dow NOT IN ('Friday', 'Saturday')
ELSE dow NOT IN ('Saturday', 'Sunday')
END)
ORDER BY date;
我通常不喜欢 WHERE
子句中的 CASE
表达式,但这确实回答了你的问题。
我正在努力从我的数据中删除周末。 AE
和 SA
国家/地区的周末是周五和周六,其他所有国家/地区的周末是周六和周日。
这是我的数据预览,
这是我的查询尝试,
SELECT*
FROM
(SELECT
Country,
date,
FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
ORDER BY date)
WHERE
(country IN ('AE', 'SA') AND NOT (dow LIKE 'Friday' OR dow LIKE 'Saturday')) OR
country NOT IN ('AE', 'SA') AND NOT (dow LIKE 'Saturday' OR dow LIKE 'Sunday')
ORDER BY date
有没有办法存储变量,而不是在查询中列出每个国家两次?
感谢任何指导!
我发布这个答案,因为您可以对 WHERE
子句进行一些小的文体更改:
SELECT *
FROM
(
SELECT Country, date, FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
) t
WHERE
country IN ('AE', 'SA') AND dow NOT IN ('Friday', 'Saturday') OR
country NOT IN ('AE', 'SA') AND dow NOT IN ('Saturday', 'Sunday')
ORDER BY
date;
在上面,我将 LIKE
替换为 IN
,因为您似乎想使用与 dow
的相等性。此外,AND
的优先级高于 OR
,让我们去掉一些不需要的括号。
编辑:
我们甚至可以在没有任何子查询的情况下以简洁的方式编写您的查询:
SELECT Country, date, FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
WHERE
country IN ('AE', 'SA') AND FORMAT_DATE('%u', date) NOT IN (5, 6) OR
country NOT IN ('AE', 'SA') AND FORMAT_DATE('%u', date) NOT IN (6, 7)
ORDER BY
date;
一种方法是CASE
表达式:
SELECT t.*
FROM (SELECT Country, date, FORMAT_DATE('%A', date) AS dow
FROM `xxx.xxx.date`
) t
WHERE (CASE WHEN country IN ('AE', 'SA')
THEN dow NOT IN ('Friday', 'Saturday')
ELSE dow NOT IN ('Saturday', 'Sunday')
END)
ORDER BY date;
我通常不喜欢 WHERE
子句中的 CASE
表达式,但这确实回答了你的问题。