SQL - Как выбрать строку, имеющую столбец с макс. значением

date                 value

18/5/2010, 1 pm        40
18/5/2010, 2 pm        20
18/5/2010, 3 pm        60
18/5/2010, 4 pm        30
18/5/2010, 5 pm        60
18/5/2010, 6 pm        25 

я должен запросить для строки, имеющей, макс. (оценивают) (т.е. 60). Так, здесь мы получаем две строки. От этого мне нужна строка с самой низкой меткой времени в течение того дня (т.е. 18.05.2010, 15:00-> 60)

37
задан Mitch Dempsey 18 May 2010 в 02:41
поделиться

5 ответов

Ключевые слова, такие как TOP, LIMIT, ROWNUM и т. Д., Зависят от базы данных. Пожалуйста, прочтите эту статью для получения дополнительной информации.

http://en.wikipedia.org/wiki/Select_ (SQL) #Result_limits

Oracle: можно использовать ROWNUM.

select * from (select * from table 
order by value desc, date_column) 
where rownum = 1;

Отвечая на вопрос более конкретно:

select high_val, my_key
from (select high_val, my_key
      from mytable
      where something = 'avalue'
      order by high_val desc)
where rownum <= 1
50
ответ дан 27 November 2019 в 04:18
поделиться
SQL> create table t (mydate,value)
  2  as
  3  select to_date('18/5/2010, 1 pm','dd/mm/yyyy, hh am'), 40 from dual union all
  4  select to_date('18/5/2010, 2 pm','dd/mm/yyyy, hh am'), 20 from dual union all
  5  select to_date('18/5/2010, 3 pm','dd/mm/yyyy, hh am'), 60 from dual union all
  6  select to_date('18/5/2010, 4 pm','dd/mm/yyyy, hh am'), 30 from dual union all
  7  select to_date('18/5/2010, 5 pm','dd/mm/yyyy, hh am'), 60 from dual union all
  8  select to_date('18/5/2010, 6 pm','dd/mm/yyyy, hh am'), 25 from dual
  9  /

Table created.

SQL> select min(mydate) keep (dense_rank last order by value) mydate
  2       , max(value) value
  3    from t
  4  /

MYDATE                   VALUE
------------------- ----------
18-05-2010 15:00:00         60

1 row selected.

С уважением, Роб.

7
ответ дан 27 November 2019 в 04:18
поделиться

Аналитика! Это позволяет избежать необходимости дважды обращаться к таблице:

SELECT DISTINCT
       FIRST_VALUE(date_col)  OVER (ORDER BY value_col DESC, date_col ASC),
       FIRST_VALUE(value_col) OVER (ORDER BY value_col DESC, date_col ASC)
FROM   mytable;
29
ответ дан 27 November 2019 в 04:18
поделиться

Ответ состоит в том, чтобы добавить предложение наличия:

SELECT [columns]
FROM table t1
WHERE value= (select max(value) from table)
AND date = (select MIN(date) from table t2 where t1.value = t2.value)

это должно работать и избавляет от необходимости иметь дополнительный подвыбор в предложении даты.

8
ответ дан 27 November 2019 в 04:18
поделиться

Самый простой ответ будет следующим

- Создайте тестовую таблицу "t1"

create table t1
(date datetime,
value int)

-- Загрузите данные. -- Примечание: формат даты отличается от формата в вопросе

insert into t1
Select '5/18/2010 13:00',40
union all
Select '5/18/2010 14:00',20
union all
Select '5/18/2010 15:00',60 
union all
Select '5/18/2010 16:00',30 
union all
Select '5/18/2010 17:00',60 
union all
Select '5/18/2010 18:00',25 

-- найти строку с максимальным количеством и минимальной датой.

select *
from t1
where value = 
    (select max(value)  from t1)
and date = 
    (select min(date) 
    from t1
    where value = (select max(value)  from t1))

Я знаю, что вы можете сделать ответ "TOP 1", но обычно ваше решение становится достаточно сложным, чтобы вы не могли использовать его по какой-то причине.

0
ответ дан 27 November 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: