2015-08-24 2 views
1

У меня есть таблица вроде этого:Получить второе наивысшие значения из таблицы

+----+---------+------------+ 
| id | conn_id | read_date | 
+----+---------+------------+ 
| 1 |  1 | 2010-02-21 | 
| 2 |  1 | 2011-02-21 | 
| 3 |  2 | 2011-02-21 | 
| 4 |  2 | 2013-02-21 | 
| 5 |  2 | 2014-02-21 | 
+----+---------+------------+ 

Я хочу второй самый высокий read_date для частности «conn_id-х, т.е. я хочу группу, на conn_id. Пожалуйста, помогите мне понять это.

+0

Что вы хотите сделать, если есть два одинаковых максимальных значения для даты? –

ответ

2

Вот решение для конкретного conn_id:

select max (read_date) from my_table 
where conn_id=1 
and read_date<(
    select max (read_date) from my_table 
    where conn_id=1 
) 

Если вы хотите, чтобы получить его для всех conn_id с помощью group by, сделайте следующее:

select t.conn_id, (select max(i.read_date) from my_table i 
where i.conn_id=t.conn_id and i.read_date<max(t.read_date)) 
from my_table t group by conn_id; 
+0

Спасибо за ответ, но не можете ли вы изменить его для общего случая? –

+0

@PunitNaik Какой общий случай? –

+0

Он должен печатать второй по высоте «read_date» для всех уникальных «conn_id». –

0

После ответа должен работать в MSSQL:

select id,conn_id,read_date from (
select *,ROW_NUMBER() over(Partition by conn_id order by read_date desc) as RN 
from my_table 
) 
where RN =2 

Есть интересный Статья об использовании функций ранга в MySQL здесь:
ROW_NUMBER() in MySQL

0

Если ваш дизайн таблицы в качестве ID - дата согласования (т.е. большого идентификатора всегда большая дата), можно сгруппировать по идентификатору, в противном случае выполните следующие действия:

$sql_max = '(select conn_id, max(read_date) max_date from tab group by 1) as tab_max'; 

$sql_max2 = "(select tab.conn_id,max(tab.read_date) max_date2 from tab, $sql_max 
where tab.conn_id = tab_max.conn_id and tab.read_date < tab_max.max_date 
group by 1) as tab_max2"; 

$sql = "select tab.* from tab, $sql_max2 
where tab.conn_id = tab_max2.conn_id and tab.read_date = tab_max2.max_date2"; 
Смежные вопросы