SQL предпочитает одну запись другой - PullRequest
0 голосов
/ 13 ноября 2018

enter image description here

Используя вышеупомянутую структуру данных, я хочу получить записи обратно на основе группировки model_id, насколько важна запись и какова последняя запись.Поэтому для этих данных я хочу получить записи 2, 4, 6, 7 и 10.

  • Я хочу получить запись 2, потому что для model_id 1 записи 1 и 2 одинаковыважность, но 2 более свежая.
  • Я хочу получить обратно запись 4, потому что для model_id 2 запись 4 имеет более важное значение, чем запись 3.
  • Я хочу получить запись 6, потому что для model_id 3, записи 5 и 6имеют ту же важность, но более поздняя версия 6.
  • Я хочу получить запись 7, потому что это единственная запись для model_id 4, независимо от ее уровня важности.
  • Я хочуполучить запись 10, потому что она имеет более высокую важность и является самой последней из записей с более высокой важностью для model_id 5.

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

Для этого я использую MySQL 5.6.

Кто-нибудь знает, как это атаковать?

Редактировать: Добавление ссылки на db-fiddle: https://www.db-fiddle.com/f/9ZEcpn7vfBebAxnEBtfAwe/0

Это набор результатов, который я хочу вернуть:

2,  lower,  4.6, 1, 2018-10-02 12:00:00 
4,  higher, 6.3, 2, 2018-08-13 12:00:00 
6,  higher, 4.1, 3, 2018-08-23 12:00:00 
7,  higher, 7.1, 4, 2018-08-11 12:00:00 
10, higher, 4.7, 5, 2018-09-14 12:00:00

Это мой SQL-код, который был близок, благодаряподсказка об использовании DENSE_RANK ().Это дает мне правильный результат в моем локальном MySql Workbench, но не совсем правильно на db-fiddle.

set @pk1 ='';
set @rn1 =1;
set @sal ='';
set @val =1;

SELECT  id,model_id,
        importance,
        denseRank
FROM
(
  SELECT  id,model_id,
          importance,
          @rn1 := if(@pk1=model_id, if(@sal=importance, @rn1, @rn1+@val),1) as denseRank,
          @val := if(@pk1=model_id, if(@sal=importance, @val+1, 1),1) as value,
          @pk1 := model_id,
          @sal := importance    
  FROM
  (
    SELECT  id,model_id,
            importance
    FROM    temp
    ORDER BY model_id,importance,created_at desc
) A
) B where denseRank = '1' group by model_id; 

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете использовать пользовательские переменные для определения номера строки в пределах раздела model_id в соответствии с заданным порядком.

Функция

Field() позволяет нам сортировать importance поле соответственно. Затем мы можем просто рассмотреть все те строки, где номер строки равен 1.

select dt2.*
from (
      select 
        @rn := case when @mid = dt.model_id then @rn + 1
                    else 1
               end AS row_no, 
        dt.id, 
        dt.importance, 
        dt.score, 
        @mid := dt.model_id as model_id, 
        dt.created_at 
      from 
      (
        select * 
        from temp
        order by model_id, 
                 field(importance, 'higher', 'lower'), 
                 created_at DESC 
      ) AS dt
      cross join (select @rn := 0, 
                         @mid := 0) AS user_init_vars 
    ) AS dt2 
Where dt2.row_no = 1
Order by dt2.model_id;

Результат

| row_no | id  | importance | score | model_id | created_at          |
| ------ | --- | ---------- | ----- | -------- | ------------------- |
| 1      | 2   | lower      | 4.6   | 1        | 2018-10-02 12:00:00 |
| 1      | 4   | higher     | 6.3   | 2        | 2018-08-13 12:00:00 |
| 1      | 6   | higher     | 4.1   | 3        | 2018-08-23 12:00:00 |
| 1      | 7   | higher     | 7.1   | 4        | 2018-08-11 12:00:00 |
| 1      | 10  | higher     | 4.7   | 5        | 2018-09-14 12:00:00 |

Просмотр на БД Fiddle

0 голосов
/ 13 ноября 2018

К сожалению, ваша версия MySQL не имеет row_number(), что является наиболее распространенным методом написания запросов приоритизации. Но вы все равно можете сделать это:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.model_id = t.model_id
              order by find_in_set(t2.importance, 'lower,higher') desc,
                       created_at desc
              limit 1
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...