#mysql #sql #greatest-n-per-group
#mysql #sql #наибольшее число пользователей на группу
Вопрос:
Я хочу получить строки с последней датой и следующей последней датой. Я искал много сайтов, и я до сих пор не знаю, как написать инструкцию sql.
Из этого
id inputDate refNo
1 2016-09-22 16092201820X0X
2 2016-09-22 16092200230X1X
3 2016-09-22 16092200810X3X
4 2016-09-21 16092200430X2X
5 2016-09-21 16092201460X7X
6 2016-09-21 16092200430X1X
7 2016-09-20 16092202260X3X
8 2016-09-20 16092200330X6X
9 2016-09-20 16092200610X3X
10 2016-09-19 16092200430X8X
11 2016-09-19 16092200450X1X
к этому
id inputDate refNo
1 2016-09-22 16092201820X0X
2 2016-09-22 16092200230X1X
3 2016-09-22 16092200810X3X
4 2016-09-21 16092200430X2X
5 2016-09-21 16092201460X7X
6 2016-09-21 16092200430X1X
Комментарии:
1. Для какой марки / версии базы данных RDBMS это предназначено?
2. я использую xampp, localhost / phpmyadmin для тестирования дома, но в моей работе используется hibernate spring mvc. Я не знаю, что такое СУБД моей работы
Ответ №1:
В стандартном SQL ANSI вы бы использовали dense_rank()
:
select t.*
from (select t.*, dense_rank() over (order by inputdate desc) as seqnum
from t
) t
where seqnum <= 2;
MySQL не поддерживает стандартные функции окна ANSI (в отличие от всех других основных баз данных).
В MySQL это сложнее. Вот удобный метод:
select t.*
from t join
(select inputdate
from (select distinct inputdate from t) t
order by inputdate desc
limit 2
) tt
on t.inputdate = tt.inputdate;
На самом деле вам не нужен второй подзапрос, поэтому вы можете сделать:
select t.*
from t join
(select distinct inputdate
from t
order by inputdate desc
limit 2
) tt
on t.inputdate = tt.inputdate;
Но может сбить с толку запоминание того select distinct
, происходит ли это до или после order by
.
Комментарии:
1. спасибо за быстрый ответ, я попробовал ваш код, но я получил красную строку во втором select (этот тип предложения был ранее проанализирован), а также слово seqnum (псевдоним был найден ранее).
2. @peter: вам нужно сообщить нам, какую СУБД вы используете, и точное сообщение об ошибке, которое вы получаете при запуске этого оператора.