У меня есть следующий запрос, почему я пытаюсь смоделировать COUNTIF в двух таблицах:
WITH Range__A1_A4 (val) AS (
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 8 UNION ALL
SELECT 10
), NFL (SEASON, TEAM, WINS) AS (
SELECT 2010, 'KC', 10 UNION ALL
SELECT 2011, 'GB', 11
)
SELECT
(SELECT SUM(CASE WHEN NFL.WINS>R.val THEN 1 ELSE 0 END) FROM Range__A1_A4 R) ct,
*
FROM NFL;
Отсюда я получаю следующую ошибку:
Unsupported subquery type cannot be evaluated
Что не так с этим запросом и как его исправить?


Я бы написал так:
WITH Range__A1_A4 (val) AS (
SELECT * FROM VALUES
(1),
(2),
(8),
(10)
), NFL (SEASON, TEAM, WINS) AS (
SELECT * FROM VALUES
(2010, 'KC', 10),
(2011, 'GB', 11)
)
SELECT
n.*,
SUM(iff( n.wins > r.val, 1, 0)) as ct_a,
count_if (n.wins > r.val) as ct_b
FROM NFL AS n
JOIN Range__A1_A4 AS r
group by 1,2,3;
| ВРЕМЯ ГОДА | КОМАНДА | ВЫИГРЫШИ | КТ | CT_B |
|---|---|---|---|---|
| 2010 | КС | 10 | 3 | 3 |
| 2011 | ГБ | 11 | 4 | 4 |
кстати, по какой причине коррелированный подзапрос не работает в случае, когда таблицы не соединены?
поддержка коррелированных подзапросов является «частичной», и иногда простые подзапросы могут перестать работать, когда вы добавляете «несвязанный материал», и оптимизатор не может понять, как заставить его работать
тоже группа по делу, не то, чтобы я знаю..
да, похоже, он работает в нескольких других бэкэндах: gyazo.com/26cd47608d1bc3d7030b6b8c4f5cf163
о, конечно, это сделать в состоянии. Я подозреваю, что в основном легко сделать плохо (с точки зрения производительности), поэтому просто не добавлять охват функций, когда пользователь лучше знает форму своих данных и может написать SQL для решения проблемы.
да -- есть ли сокращение для чего-то вроде
group by NFL.*?