Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: [email protected]

Как сделать на MySQL

  • Автор теми Автор теми Ferox
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 25.09.2006
Повідом.: 34312
Как сделать на MySQL

В таблице три поля: value, section, date.

Требуется выбрать не более N строк, так чтобы значение section у всех в выборке было разным, а каждая выбранная строка имела date наибольший из тех, у которых такой же section как у выбранной.

Количество всех разных возможных значений section гораздо больше чем N. Количество всех строк в таблице гораздо больше, чем количество различных значений section. Количество строк с одним значением section может быть гораздо больше чем количество строк с каким-то другим значением section.
 
На MS SQL решается через OVER ... PARTITION BY и RANK ранжированием множества дат для каждой секции по убыванию и затем выборкой только TOP N строк, имеющих ранг "1".

Если верить Гуглу, на MySQL подобного эффекта добиваются вот так:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
В таблице три поля: value, section, date.

Требуется выбрать не более N строк, так чтобы значение section у всех в выборке было разным, а каждая выбранная строка имела date наибольший из тех, у которых такой же section как у выбранной.

Количество всех разных возможных значений section гораздо больше чем N. Количество всех строк в таблице гораздо больше, чем количество различных значений section. Количество строк с одним значением section может быть гораздо больше чем количество строк с каким-то другим значением section.

Кто такие "всех"? И чем плох:
Код:
select distinct smt.section
     , smt.date
     , smt.value
  from something smt
     , (select section
             , max(date) as date
          from something
         group by section) max
 where smt.section = max.section
   and smt.date = max.date
 limit 10

На MS SQL решается через OVER ... PARTITION BY и RANK...

Это называется "аналитические функции".
 
Могу ошибаться, но по-моему в твоем решении есть риск выбрать несколько строк для одной секции, если у них всех одна и та же (максимальная) дата.
 
На distinct обрати внимание
 
Да, ASokol правильно написал... А я тут тем временем сделал через временные таблицы.
 
Тьфу ты, протупил, отнес distinct к внутреннему подзапросу. :клас: и + в репу за простое решение.
Есть мнение, что вот на этом наборе данных:
value section data
1 1 1
2 1 2
2 1 2
2 1 3
4 1 3

это простое решение выдает две строки с одинаковым полем section - плевать ему на дистинкт.
Но еще одна группировка по section и data вместо дистинкта спасет гражданина АСокола ;)
 
Есть мнение, что вот на этом наборе данных:
value section data
1 1 1
2 1 2
2 1 2
2 1 3
4 1 3

это простое решение выдает две строки с одинаковым полем section - плевать ему на дистинкт.
Но еще одна группировка по section и data вместо дистинкта спасет гражданина АСокола ;)

Согласен.

Код:
select smt.section
     , smt.date
     , max(smt.value)
  from something smt
     , (select section
             , max(date) as date
             , max(value) as value
          from something
         group by section) max
 where smt.section = max.section
   and smt.date = max.date
 group by smt.section
     , smt.date
 limit 10
 
Назад
Зверху Знизу