有没有更好的方法来编写这个 Google BigQuery?

Is there a better way to write this Google BigQuery?

我正在努力从我的数据中删除周末。 AESA 国家/地区的周末是周五和周六,其他所有国家/地区的周末是周六和周日。

这是我的数据预览,

这是我的查询尝试,

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 表达式,但这确实回答了你的问题。