изменение запроса без использования аналитической функции - PullRequest
0 голосов
/ 29 сентября 2019

Может ли кто-нибудь помочь мне изменить приведенный ниже код с помощью аналитической / агрегатной функции, поскольку я должен использовать его для создания материализованного представления с возможностью быстрого принятия обновления.

SELECT col1, col2 
FROM ( SELECT DISTINCT table_A.column3, table_b.column4,
            CASE  WHEN table_b.col5 = 'A' THEN RANK() OVER (PARTITION BY table_A.col1, table_b.col5 ORDER BY table_b.col6, table_b.col7 DESC) END AS rnk_a,
            CASE WHEN table_b.col5 = 'Z' THEN RANK() OVER (PARTITION BY table_A.col1, table_b.col5 ORDER BY table_b.col6 DESC, table_b.col7 DESC) END AS rnk_z
        FROM table_A
        INNER JOIN table_B sc ON tale_B.col4 = table_a.col3
    )
WHERE (RNK_A = 1) OR (RNK_Z = 1)

*sample dataset:*

 id     col5    col6   col7
A1A150    A      001    20245
A1A150    A      002    20246
A1A150    A      002    20244
A1A150    Z      001    1023
A1A150    Z      002    1022

Expected resultset:

  id     col5     col6   col7
A1A150    A       002    20246
A1A150    Z       001    1023

** Если найдено несколько записей для col5 = 'A' или col5 = 'Z': возьмите min (col6) и max (col7)

, когда несколько записей с loc= 'A' или loc = 'Z' с тем же значением col5 и diff col7 найдено, максимальная логика не работает. пожалуйста, поправьте меня, где я иду не так.

SELECT col1, col2  FROM ( SELECT DISTINCT table_A.column3, table_b.column4,
          CASE WHEN table_b.col5 = 'A' AND table_b.col7 = (SELECT MAX(table_b.col7) FROM table_b cp1 WHERE cp1.id = table_A.col1 GROUP BY table_A.col1)THEN 1 ELSE 0 END AS rnk_a,
          CASE WHEN table_b.col5 = 'Z' AND table_b.col7 = (SELECT MAX(table_b.col7) FROM table_b cp1 WHERE cp1.id = table_A.col1 GROUP BY table_A.col1)THEN 1 ELSE 0 END AS rnk_z
        FROM table_A
        INNER JOIN table_B sc ON tale_B.col4 = table_a.col3
    )
WHERE (RNK_A = 1) OR (RNK_Z = 1)

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Вы можете использовать CASE и ROW_NUMBER() для ранжирования записей в подзапросе (или RANK(), если это лучше подходит для вашего варианта использования), а затем фильтровать во внешнем запросе:

SELECT id, col5, col6, col7
FROM (
    SELECT
        t.*,
        CASE col5
            WHEN 'A' THEN ROW_NUMBER() OVER(PARTITION BY col5 ORDER BY col6 DESC, col7 DESC)
            WHEN 'Z' THEN ROW_NUMBER() OVER(PARTITION BY col5 ORDER BY col6 ASC,  col7 DESC)
        END rn
    FROM mytable t
) x 
WHERE rn = 1
0 голосов
/ 30 сентября 2019

Вы можете достичь этого, используя подзапрос -

SELECT T1.id, T1.col5, T1.col6, T1.col7
FROM table_A T1
JOIN (SELECT id, col5, MAX(col7) col7
      FROM table_B
      GROUP BY id, col5) T2
ON T1.id = T2.id 
AND T1.col5 = T2.col5
AND T1.col7 = T2.col7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...