SQL first_value() 按特定日期部分

Posted

技术标签:

【中文标题】SQL first_value() 按特定日期部分【英文标题】:SQL first_value() by specific datepart 【发布时间】:2019-02-24 15:38:18 【问题描述】:

我有数据,其中包含特定日期 (yyyy-mm-dd) 及其城市和价值

-------------------------------------
   city   |  date       | value
-------------------------------------
   city A |  2018-05-01 |  10
   city A |  2018-04-03 |  15
   city A |  2019-01-03 |  9
   city A |  2019-05-01 |  13
   city B |  2019-05-01 |  12
   city B |  2019-02-12 |  11

我想在下一列中获得按城市划分的每年的第一个值:

--------------------------------------------------
   city   |  date       | value | first_value_year_by_city
--------------------------------------------------
   city A |  2018-05-01 |  10   |    15
   city A |  2018-04-03 |  15   |    15
   city A |  2019-01-03 |  9    |    9
   city A |  2019-05-01 |  13   |    9
   city B |  2019-05-01 |  12   |    11
   city B |  2019-02-12 |  11   |    11

为此我使用了 SQL:

select *,
,first_value(value) over(partition by city order by date rows between unbounded preceding and unbounded following) as first_value_year_by_city
 from table

但我不能将 datepart(year,date) = 2018 和 datepart(year,date) = 2019 放在 first_value() 中。我们怎么能做到这一点?

【问题讨论】:

【参考方案1】:

你可以把年份放在partition by:

select t.*,
       first_value(value) over (partition by city, year(date)
                                order by date
                               ) as first_value_year_by_city
from table t;

【讨论】:

以上是关于SQL first_value() 按特定日期部分的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何将 first_value 忽略为聚合?

在 SQL/Impala 中按特定的分钟数对日期时间进行分组

带有WHERE子句逻辑的SQL Server存储过程

如何获取 SQL 中的第一个非 NULL 值?

如何在SQL Server中选择特定日期的行,忽略时间。

按日期部分比较实体框架中的SQL日期时间