如何在SQL中获取一年中数字字段的最大每日值

时间:2009-05-31 12:53:56

标签: sql sql-server

如何在MS-SQL

中获取一年内数字字段的最大每日值

4 个答案:

答案 0 :(得分:4)

这将查询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 :(得分:1)

您没有提到您正在使用哪种RDBMS或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或最高值,那么查询将需要稍微更改。

答案 2 :(得分:0)

这样的东西
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))将仅提取日期部分,然后您可以按该值进行分组以获得每日最大值。可能有一种更漂亮的方式来获得日期部分。

你也可以使用between结构来避免小于和大于。

答案 3 :(得分:0)

在日期分组,使用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