Redshift Cross присоединиться, игнорируя пункт где - PullRequest
2 голосов
/ 03 февраля 2020

У меня следующий запрос:

WITH MY_CTE as
(
select
....
.....
    )
SELECT
MY_CTE.*
,tt.currency as most_used_currency
from MY_CTE
cross join 
     (select t.currency
      from My_CTE t
      group by t.currency
      order by count(*) desc
      limit 1
     ) tt 
where MY_CTE.currency = 'EUR'

, но перекрестное соединение игнорирует мое предложение where. Как я могу добиться того, чтобы он обрабатывал условие where перед работой над перекрестным соединением, пожалуйста?

Пример возвращаемых данных:

![enter image description here

This очевидно, неправильно, потому что я сказал, не включают валюту SEK, и все же он говорит, что это самая популярная валюта. Я не могу поместить предложение where в перекрестное объединение, потому что я буду использовать это в таблице и мне нужно, чтобы пользователи могли фильтровать по определенным критериям, например по валюте.

Наиболее популярной валютой должен быть евро, если Фильтр MY_CTE показывает только валюту EUR

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

ГДЕ условие в этом случае не имеет ничего общего с перекрестным соединением, оно просто фильтрует строки после того, как объединение уже выполнено. Если вам нужно сообщить только одну валюту, есть два простых способа добавить фильтр валют (добавленный как комментарии в SQL):

1) Вариант 1 - добавить фильтр уже в выражении CTE

2) Вариант 2 - добавить фильтр в конце (как уже сделано) и внутри части tt.

WITH MY_CTE as
(
select
....
.....
/* OPTION 1*/
    )
SELECT
MY_CTE.*
,tt.currency as most_used_currency
from MY_CTE
cross join 
     (select t.currency
      from My_CTE t
     /* OPTION 2 first place*/
      group by t.currency
      order by count(*) desc
      limit 1
     ) tt 
where MY_CTE.currency = 'EUR' /* OPTION 2a second place*/
0 голосов
/ 06 февраля 2020

Псевдоним tt вернет самую популярную валюту в целом - SEK. Если вы хотите отфильтровать отдельные валюты, вам нужно поместить их как во внутренний запрос, так и во внешний. Однако, если это не вариант, вам нужно вернуть все валюты с их популярностью и выбрать самую популярную, какую вы разрешаете.

....
....
SELECT
LAST_VALUE(MY_CTE.customer_id) 
           OVER (partition by customer_id 
           ORDER BY tt.popularity
      rows between unbounded preceding and unbounded following) 
.... /* rest of your columns */
, LAST_VALUE(tt.currency) 
           OVER (partition by customer_id 
           ORDER BY tt.popularity
      rows between unbounded preceding and unbounded following) 
from MY_CTE
cross join 
 (select t.currency,
         count(*) popularity
      from My_CTE t
      group by t.currency
      order by count(*) desc
      /* removed limit 1 */
     ) tt 
where MY_CTE.currency = 'EUR' 
  AND tt.currency IN ('EUR') /* Added tt.currency filter */
...