SQL - порядок перед группой по - PullRequest
0 голосов
/ 09 марта 2020

У меня одна таблица продуктов:


| id       | code     | active
--------------------------------
| 1        | 1111     | 0    |
| 2        | 1111     | 0    |
| 3        | 1111     | 1    |
| 4        | 2222     | 0    |
| 5        | 2222     | 1    |
| 6        | 2222     | 0    |
| 7        | 3333     | 0    |
| 8        | 3333     | 0    |
| 9        | 3333     | 0    |
--------------------------------

И я хочу выбрать одну запись из каждого кода. Но если active = 1, то запись имеет приоритет. Итак, я хочу увидеть:


| id       | code     | active
--------------------------------
| 3        | 1111     | 1    |
| 5        | 2222     | 1    |
| 7        | 3333     | 0    |
--------------------------------

Я пытался:

select * from (Select * from products order by active desc) as query group by code 

Но я не работаю и покажу:


| id       | code     | active
--------------------------------
| 1        | 1111     | 0    |
| 4        | 2222     | 0    |
| 7        | 3333     | 0    |
--------------------------------

Кто-нибудь может мне помочь? Спасибо!

Ответы [ 3 ]

4 голосов
/ 09 марта 2020

С условным агрегированием:

select 
  coalesce(min(case when active = 1 then id end), min(id)) id, code, max(active) active
from products
group by code

Для MySql 8.0+ вы можете использовать ROW_NUMBER():

select p.id, p.code, p.active
from (
  select *, row_number() over (partition by code order by active desc, id) rn
  from products
) p 
where p.rn = 1  

См. Демонстрационную версию . Результаты:

> id | code | active
> -: | ---: | -----:
>  3 | 1111 |      1
>  5 | 2222 |      1
>  7 | 3333 |      0
1 голос
/ 09 марта 2020

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

select x.*
from
(select a.*,
       row_number() Over(partition by code order by active desc) as rownum1
from products a) x
where x.rownum1=1

Надеюсь, это поможет.

0 голосов
/ 09 марта 2020

Используйте коррелированный подзапрос:

select p.*
from products p
where p.id = (select p2.id 
              from products p2
              where p2.code = p.code
              order by p2.active desc
              limit 1
             );

GROUP BY для суммирования строк, а не для выбора конкретной строки.

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