SQL "group by" использует приоритет - PullRequest
3 голосов
/ 04 июля 2011

У меня есть таблица, в которой я могу иметь несколько имен для данного идентификатора, например:

a_table (id int, имя varchar (100), priority int);

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

например, если мои данные

1, AaaB, 2
1, AbbB, 1
1, AccB, 0
2, foo, 0
3, AddC, 0

Я хочу, чтобы мой запрос для "A%" возвращал:

1, AaaB
3, AddC

Я думал что-то вроде:

select * from a_table where name like 'A%' group by id;

Но это не гарантирует, что значение с более высоким приоритетом будетбыть выбранным.

Есть идеи?

Спасибо, Ставрос

Ответы [ 5 ]

5 голосов
/ 04 июля 2011
1 голос
/ 04 июля 2011

Сначала вы должны получить наивысший приоритет для каждого идентификатора, а затем отфильтровать имена:

select t2.id, t2.name, t2.price 
  from (
        select id, max(priority)
          from a_table
         group by id
       ) t1,
       a_table t2
 where t1.id = t2.id
   and t1.priority = t2.priority
   and t2.name like 'A%'

Принимая правильное предложение @ niktrs, это тот же самый запрос, использующий стандартный JOIN вместо where для соединения столов.Это более предпочтительнее по сравнению с предыдущим

select t2.id, t2.name, t2.price 
  from (
        select id, max(priority)
          from a_table
         group by id
       ) t1 JOIN a_table t2 ON t1.id = t2.id
   and t1.priority = t2.priority
   and t2.name like 'A%'
0 голосов
/ 04 июля 2011

это сработает,

выберите отличный идентификатор, first_value (имя) более (разделение по порядку идентификаторов по имени) от demo_tab t где t.name вроде 'A%'

Извините, пратик, это должно было быть

выберите отличный идентификатор, first_value (имя) более (разделение по порядку идентификаторов по приоритету desc) из demo_tab, где имя как 'A%'

0 голосов
/ 04 июля 2011
select id, name 
from a_table at
where 
    name like 'A%' and
    priority = (
        select max(priority)
        from a_table
        where (id = at.id) and (name like 'A%')            
    )
0 голосов
/ 04 июля 2011
select *
from a_table t
join (
    select max(Priority) MaxPriority, Name
    from a_table a
    where name like 'A%'
    group by Name
)x where x.MaxPriority=a.Priority and x.Name=t.Name

На основании первого столбца в примере данных «Приоритет».

Это просто SQL, связанный с ответом Альваро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...