Результаты первого подзапроса Oracle - PullRequest
4 голосов
/ 17 января 2011

Я хочу получить верхнюю 1 строку для каждого уникального значения b с минимальным значением c для этого конкретного значения b.Даже при том, что может быть более 1 строки с одинаковым значением min (только выбрал первое)

myTable

  • целое число (уникальное)
  • b целое число
  • c целым числом

Я пробовал этот запрос

SELECT t1.* 
  FROM myTable t1, 
       (SELECT b, 
               MIN(c) as c 
          FROM myTable 
      GROUP BY b) t2 
 WHERE t1.b = t2.b 
   AND t1.c = t2.c

Однако в этой таблице может быть более 1 экземпляра минимумазначение с для данного значения б.Приведенный выше запрос генерирует дубликаты в этих условиях.

У меня такое ощущение, что мне нужно где-то использовать rownum, но я не совсем уверен, где.

Ответы [ 2 ]

9 голосов
/ 17 января 2011

Вы можете использовать ROW_NUMBER :

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY b ORDER BY c) AS rn
    FROM myTable
) AS T1
WHERE rn = 1
0 голосов
/ 17 января 2011

Чтобы разорвать связь между равными c, вам нужно будет выполнить подзапрос еще на один уровень, чтобы получить min-a для каждой группы равных c за b.(Полный рот!)

select t0.*
FROM myTable t0
inner join (
    select t1.b, t1.c, MIN(a) as a
    from myTable t1
    inner join (
        select b, min(c) as c 
        from myTable 
        group by b
    ) t2 on t1.b = t2.b and t1.c = t2.c
    group by t1.b, t1.c
) t3 on t3.a = t0.a and t3.b = t0.b and t3.c = t0.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...