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
Мне нужно запросить строку, имеющую max (значение) (т.е. 60). Итак, здесь мы получаем две строки. Из этого мне нужна строка с самой низкой отметкой времени для этого дня (т.е. 18/5/2010, 15:00 → 60)
Ответы
Ответ 1
Ключевые слова, такие как 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
Ответ 2
Аналитика! Это позволяет избежать доступа к таблице дважды:
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;
Ответ 3
Ответ заключается в том, чтобы добавить предложение having:
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)
это должно работать и избавиться от необходимости иметь дополнительный поднабор в предложении даты.
Ответ 4
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.
С уважением,
Роб.
Ответ 5
В Oracle:
Это получает ключ от max (high_val) в таблице в соответствии с диапазоном.
select high_val, my_key
from (select high_val, my_key
from mytable
where something = 'avalue'
order by high_val desc)
where rownum <= 1
Ответ 6
Самый простой ответ -
- установить тестовую таблицу под названием "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", но обычно ваше решение становится достаточно сложным, и вы почему-то не можете его использовать.
Ответ 7
Вы можете использовать эту функцию, ORACLE DB
public string getMaximumSequenceOfUser(string columnName, string tableName, string username)
{
string result = "";
var query = string.Format("Select MAX ({0})from {1} where CREATED_BY = {2}", columnName, tableName, username.ToLower());
OracleConnection conn = new OracleConnection(_context.Database.Connection.ConnectionString);
OracleCommand cmd = new OracleCommand(query, conn);
try
{
conn.Open();
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
result = dr[0].ToString();
dr.Dispose();
}
finally
{
conn.Close();
}
return result;
}