Как получить максимальное дневное значение числового поля за год в SQL - PullRequest
0 голосов
/ 31 мая 2009

Как получить максимальное дневное значение числового поля за год в MS-SQL

Ответы [ 4 ]

4 голосов
/ 31 мая 2009

Это будет запрашивать дневной максимум значения за 2008 год:

select 
    datepart(dayofyear,datecolumn)
,   max(value)
from yourtable
where '2008-01-01' <= datecolumn and datecolumn < '2009-01-01'
group by datepart(dayofyear,datecolumn)

Или дневной максимум за каждый год:

select 
    datepart(year,datecolumn), 
,   datepart(dayofyear,datecolumn)
,   max(value)
from yourtable
group by datepart(year,datecolumn), datepart(dayofyear,datecolumn)

Или число дней с наибольшим значением в году:

select 
    Year = datepart(year,datecolumn),
,   DayOfYear = datepart(dayofyear,datecolumn)
,   MaxValue = max(MaxValue)
from yourtable
inner join (
    select 
        Year = datepart(year,datecolumn), 
    ,   MaxValue = max(value)
    from yourtable
    group by datepart(year,datecolumn)
) sub on 
    sub.Year = yourtable.datepart(year,datecolumn)
    and sub.MaxValue = yourtable.value
group by 
    datepart(year,datecolumn),
    datepart(dayofyear,datecolumn)
1 голос
/ 31 мая 2009

Вы не упомянули, какую СУБД или диалект SQL вы используете. Следующее будет работать с T-SQL (MS SQL Server). Это может потребовать некоторых модификаций для других диалектов, так как функции даты часто меняются между ними.

SELECT
     DATEPART(dy,  my_date),
     MAX(my_number)
FROM
     My_Table
WHERE
     my_date >= '2008-01-01' AND
     my_date < '2009-01-01'
GROUP BY
     DATEPART(dy, my_date)

Функцией DAY может быть любая функция или комбинация функций, которые дают вам дни в формате, который вы хотите получить.

Кроме того, если есть дни без строк, они не будут возвращены. Если вам также нужны эти дни с NULL или с наибольшим значением предыдущего дня, запрос необходимо будет немного изменить.

0 голосов
/ 31 мая 2009

Группируйте по дате, используйте делегат max для получения наибольшего значения для каждой даты, сортируйте по значению и получите первую запись.

Пример:

select top 1 theDate, max(theValue)
from TheTable
group by theDate
order by max(theValue) desc

(Поле даты должно содержать только дату, чтобы эта группировка работала, т. Е. Компонент времени должен быть равен нулю.)

Если вам нужно ограничить запрос для определенного года, используйте начальную и конечную дату в where предложениях:

select top 1 theDate, max(theValue)
from TheTable
where theDate between '2008-01-01' and '2008-12-13'
group by theDate
order by max(theValue) desc
0 голосов
/ 31 мая 2009

Что-то вроде

SELECT dateadd(dd,0, datediff(dd,0,datetime)) as day, MAX(value) 
FROM table GROUP BY dateadd(dd,0, datediff(dd,0,datetime)) WHERE 
datetime < '2009-01-01' AND datetime > '2007-12-31' 

Предполагая, что datetime является вашим столбцом даты, dateadd (dd, 0, datediff (dd, 0, datetime)) извлечет только часть даты, а затем вы можете сгруппировать по этому значению, чтобы получить максимальное дневное значение. Хотя может быть более красивый способ получить только часть даты.

Вы также можете использовать конструкцию Между, чтобы избежать значений меньше и больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...