如何在SQL中获得一年内数值字段的最大日值
如何在MS-SQL中获得一年内数值字段的最大日值这将查询2008年的最大日值:如何在SQL中获得一年内数值字段的最大日值,sql,sql-server,Sql,Sql Server,如何在MS-SQL中获得一年内数值字段的最大日值这将查询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 Ye
select
datepart(dayofyear,datecolumn)
, max(value)
from yourtable
where '2008-01-01' <= datecolumn and datecolumn < '2009-01-01'
group by 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)
这将查询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
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)
差不多
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'
选择dateadd(dd,0,datediff(dd,0,datetime))作为日期,最大值
从表组按日期添加(dd,0,datediff(dd,0,datetime)),其中
日期时间<'2009-01-01'和日期时间>'2007-12-31'
假设datetime是您的日期列,dateadd(dd,0,datediff(dd,0,datetime))将只提取日期部分,然后您可以按该值分组以获得最大的每日值。不过,可能有一种更漂亮的方式,只获得约会部分
您还可以使用between构造来避免小于和大于
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'
选择dateadd(dd,0,datediff(dd,0,datetime))作为日期,最大值
从表组按日期添加(dd,0,datediff(dd,0,datetime)),其中
日期时间<'2009-01-01'和日期时间>'2007-12-31'
假设datetime是您的日期列,dateadd(dd,0,datediff(dd,0,datetime))将只提取日期部分,然后您可以按该值分组以获得最大的每日值。不过,可能有一种更漂亮的方式,只获得约会部分
您还可以使用between构造来避免小于和大于。您没有提到您使用的是哪种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)
选择
日期部分(dy,我的日期),
MAX(我的号码)
从…起
我的桌子
哪里
我的日期>='2008-01-01'和
我的工作日期<'2009-01-01'
分组
日期部分(dy,我的日期)
DAY函数可以是任何函数或函数组合,它们以您希望得到的格式为您提供日期
此外,如果有没有行的天,那么它们将不会被返回。如果您还需要使用空值或前一天的最高值,则需要稍微更改查询。您没有提到您使用的是哪种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)
选择
日期部分(dy,我的日期),
MAX(我的号码)
从…起
我的桌子
哪里
我的日期>='2008-01-01'和
我的工作日期<'2009-01-01'
分组
日期部分(dy,我的日期)
DAY函数可以是任何函数或函数组合,它们以您希望得到的格式为您提供日期
此外,如果有没有行的天,那么它们将不会被返回。如果您还需要使用空值或前一天的最高值的天数,则需要稍微更改查询。对日期分组,使用
max
委托获取每个日期的最高值,对值进行排序,并获取第一条记录
例如:
select top 1 theDate, max(theValue)
from TheTable
group by theDate
order by max(theValue) desc
(日期字段只需包含此分组工作的日期,即时间组件必须为零。)
如果需要限制特定年份的查询,请在中使用开始和结束日期,其中类别:
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
按日期分组,使用max
委托获取每个日期的最高值,按值排序,并获取第一条记录
例如:
select top 1 theDate, max(theValue)
from TheTable
group by theDate
order by max(theValue) desc
(日期字段只需包含此分组工作的日期,即时间组件必须为零。)
如果需要限制特定年份的查询,请在中使用开始和结束日期,其中类别:
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
从你得到的非常不同的建议来看,你需要明确你的意思。从你得到的非常不同的建议来看,你需要明确你的意思。我认为DAY()返回月日,datepart(dy,…)将取一年中的某一天。问题似乎提到了MSSQL。我认为DAY()返回月份的第几天,datepart(dy,…)将取一年中的第几天。这个问题似乎提到了MSSQL。如果包含,您应该使用2008-12-31来代替2009-01-01。在Sql Server中,“2008-12-31”的意思是“2008-12-31 00:00:00.000”,这样就可以跳过一年的最后一天。也许“'2008-01-01'包含在内,您应该使用2008-12-31来代替2009-01-01。在Sql Server中,“2008-12-31”的意思是“2008-12-31 00:00:00.000”,这样会跳过一年的最后一天。也许“'2008-01-01'在Sql Server中,如果按日期字段分组,它将按准确的时刻分组,而不是按整天分组。如果没有等效的datepart(),则“2008-01-01 00:01”和“2008-01-01 00:02”将作为两行结束。是的,时间组件自然必须为零,分组才能工作。谢谢你的澄清。我将添加一个关于分组工作要求的注释。在Sql Server中,如果按日期字段分组,它将在准确的时刻分组,而不是一整天。如果没有等效的datepart(),则“2008-01-01 00:01”和“2008-01-01 00:02”将作为两行结束。是的,时间组件自然必须为零,分组才能工作。谢谢你的澄清。我将添加一个关于分组工作要求的注释。