Вытащите несколько записей из разных групп в Oracle на основе значения в другом столбце - PullRequest
1 голос
/ 17 мая 2019

Это может показаться немного запутанным, поэтому я постараюсь сделать это кратким. По сути, мне нужно выполнить запрос, который группирует результаты на основе COL1, и оттуда он смотрит на максимальное значение в COL2. Как только он определит, какое наибольшее значение в COL2, он должен посмотреть на значение в COL3 и затем извлечь каждую запись в группе, имеющую такое же значение. В таблице есть другие столбцы, из которых мне нужны значения, но они не используются в логике запроса.

SOME_TABLE

  COL1    COL2     COL3
1 12345   100      A
2 12345   (null)   A
3 12345   50       B
4 12346   0        A
5 12346   (null)   A
6 12346   100      B
7 12346   20       B

Так что в этом примере для строк со значением COL1, равным 12345, я бы хотел строки 1 и 2 (ему просто нужен единственный экземпляр с самым высоким значением, не имеет значения, что остальные значения строк). Для COL1 со значением 12346 мне нужны строки с B в COL3.

Вот пример выходных данных в немного более удобочитаемом формате:

  COL1    COL2     COL3
1 12345   100      A
2 12345   (null)   A
6 12346   100      B
7 12346   20       B

Я пробовал множество различных запросов и перестановок запросов, но безуспешно. Я не уверен, насколько конструктивно было бы размещать кучу запросов, которые не работают. Два самых больших подхода, которые я пробовал, включают в себя регулярное выражение GROUP BY, а также PARTITION BY для COL1.

Следует также отметить, что я пытался реализовать это на стороне приложения C#, а также использовать циклы в сценарии SQL, но результаты были либо смешанными, либо производительность была невероятно низкой.

Я не нашел ничего полезного в SO или в "документации" Oracle.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Вы хотите, чтобы все строки, в которых значения col3 совпадали с максимальными для col1. Коррелированный подзапрос кажется наиболее естественным способом выразить это:

select t.*
from t
where t.col3 = (select max(t2.col3) keep (dense_rank first order by col2 desc)
                from t t2
                where t2.col1 = t.col1
               );

В длинном выражении keep просто говорится "оставьте первое значение col3 для наибольшего значения col2.

0 голосов
/ 17 мая 2019

Пример ожидаемого результата может помочь. Попробуйте это:

    select col1, col3, max(col3)
    from table
    group by col1, col3
0 голосов
/ 17 мая 2019

Вы можете использовать оконные функции:

WITH cte AS (SELECT t.*, MAX(col2) OVER(PARTITION BY col1) m FROM t)
SELECT *
FROM t
WHERE (COL1,COL3) IN (SELECT col1, col3 FROM cte WHERE col2 = m);

db <> Fiddle demo

Выход:

+-----+--------+-------+------+
| ID  | COL1   | COL2  | COL3 |
+-----+--------+-------+------+
|  2  | 12345  |       | A    |
|  1  | 12345  |  100  | A    |
|  7  | 12346  |   20  | B    |
|  6  | 12346  |  100  | B    |
+-----+--------+-------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...