Google bigquery BigQuery对带有WHERE子句的列应用秩/百分比秩
我有一个相当宽的bigquery表,有20-30个不同的列,每个列都需要接收一个补充的百分位列,它显示了与表中所有其他行相比的列的百分位值。但是,如果另一列中的值满足某个阈值,则每列只应接收一个百分比值。为了展示这一点,我在下面创建了一个可复制的示例:Google bigquery BigQuery对带有WHERE子句的列应用秩/百分比秩,google-bigquery,Google Bigquery,我有一个相当宽的bigquery表,有20-30个不同的列,每个列都需要接收一个补充的百分位列,它显示了与表中所有其他行相比的列的百分位值。但是,如果另一列中的值满足某个阈值,则每列只应接收一个百分比值。为了展示这一点,我在下面创建了一个可复制的示例: WITH correct_games_played AS ( SELECT "a" as name, 7 as num1, 0.4 as num2, 0.55 as num3 UNION ALL SELECT
WITH
correct_games_played AS
(
SELECT "a" as name, 7 as num1, 0.4 as num2, 0.55 as num3
UNION ALL SELECT "b" as name, 13 as num1, 0.53 as num2, 0.37 as num3
UNION ALL SELECT "c" as name, 4 as num1, 0.42 as num2, 0.32 as num3
UNION ALL SELECT "d" as name, 17 as num1, 0.6 as num2, 0.23 as num3
UNION ALL SELECT "e" as name, 7 as num1, 0.3 as num2, 0.25 as num3
UNION ALL SELECT "f" as name, 16 as num1, 0.7 as num2, 0.43 as num3
UNION ALL SELECT "g" as name, 10 as num1, 0.53 as num2, 0.52 as num3
UNION ALL SELECT "h" as name, 5 as num1, 0.54 as num2, 0.21 as num3
UNION ALL SELECT "i" as name, 9 as num1, 0.56 as num2, 0.17 as num3
UNION ALL SELECT "j" as name, 3 as num1, 0.75 as num2, 0.53 as num3
)
SELECT
a.*,
-- RANK() OVER(ORDER BY a.num1 DESC) AS num1_rank,
-- RANK() OVER(ORDER BY a.num2 DESC) AS num2_rank,
-- RANK() OVER(ORDER BY a.num3 DESC) AS num3_rank
RANK() OVER(ORDER BY a.num1 DESC) AS num1_rank,
RANK() OVER(ORDER BY a.num2 WHERE a.num1 > 4 DESC) AS num2_rank
RANK() OVER(ORDER BY a.num3 WHERE a.num1 > 3 DESC) AS num3_rank
FROM correct_games_played as a
此脚本抛出错误语法错误:Expected”)”,但在[22:37]处得到关键字WHERE
,但是如果我将rank()
替换为注释掉的rank()
,则此操作有效。我的目标非常简单:
:如果num2\u秩
大于4,则仅在a.num1
中显示秩值,否则显示a.num2
值null
:如果num3\u秩
大于3,则仅在a.num1
中显示秩值,否则显示a.num3
值null
我的表很宽,每个列都可能需要自己的条件来确定是否应该对每个列的行的值进行排序。在此方面的任何帮助都将不胜感激,谢谢 下面是BigQuery标准SQL
#standardSQL
WITH correct_games_played AS (
SELECT "a" AS name, 7 AS num1, 0.4 AS num2, 0.55 AS num3 UNION ALL
SELECT "b" AS name, 13 AS num1, 0.53 AS num2, 0.37 AS num3 UNION ALL
SELECT "c" AS name, 4 AS num1, 0.42 AS num2, 0.32 AS num3 UNION ALL
SELECT "d" AS name, 17 AS num1, 0.6 AS num2, 0.23 AS num3 UNION ALL
SELECT "e" AS name, 7 AS num1, 0.3 AS num2, 0.25 AS num3 UNION ALL
SELECT "f" AS name, 16 AS num1, 0.7 AS num2, 0.43 AS num3 UNION ALL
SELECT "g" AS name, 10 AS num1, 0.53 AS num2, 0.52 AS num3 UNION ALL
SELECT "h" AS name, 5 AS num1, 0.54 AS num2, 0.21 AS num3 UNION ALL
SELECT "i" AS name, 9 AS num1, 0.56 AS num2, 0.17 AS num3 UNION ALL
SELECT "j" AS name, 3 AS num1, 0.75 AS num2, 0.53 AS num3
)
SELECT *,
RANK() OVER(ORDER BY num1 DESC) AS num1_rank,
IF(num1 > 4, RANK() OVER(ORDER BY IF(num1 > 4, num2, NULL) DESC), NULL) AS num2_rank,
IF(num1 > 3, RANK() OVER(ORDER BY IF(num1 > 3, num3, NULL) DESC), NULL) AS num3_rank
FROM correct_games_played
我错过了这一点