查询返回日期范围内的行,但只返回列的最大值

Posted

技术标签:

【中文标题】查询返回日期范围内的行,但只返回列的最大值【英文标题】:Query to return rows in date range but return only max value of column 【发布时间】:2013-08-29 13:08:26 【问题描述】:

我想要做的是从表格中选择价格,其中给出的日期在表格中的开始日期和结束日期之间。

SELECT price 
FROM table 
WHERE 'dategiven' BETWEEN startdate AND enddate

使用日期时间过滤器很容易。问题是我在提供的时间窗口中有多个记录,我也有一个版本列。

下面是我的表格示例:

我希望我的查询输出如下,我的dategiven2013-08-25

Milk 有 3 条记录,其中 2 条对 dategiven 有效(2013-08-25)。然后我想返回最高版本的结果?

类似:

SELECT
    price 
FROM table 
WHERE 'dategiven' BETWEEN startdate AND enddate AND max(version)

【问题讨论】:

【参考方案1】:

使用row_number() 函数对行进行排名

select product, price, version
from
(    
    select 
        *, 
        row_number() over (partition by product order by version desc) rn
    from yourtable
    where @dategiven between startdate and enddate
) v
where rn = 1

【讨论】:

【参考方案2】:

可能不是最有效的方法,但是:

select price 
 from table 
where 
  'dategiven' between startdate and enddate 
  and version = 
    (
       select max(version) from table t2 where t2.product = table.product
       and 'dategiven' between startdate and enddate 
    )

【讨论】:

日期过滤器应该在子查询中。 如果每个产品的版本号是唯一的,您不需要在主查询的 startdate 和 enddate 之间设置“dategiven”,只需将其放在子查询中就足够了 是的,但它可能有助于优化器在较少的初始行上进行子选择。【参考方案3】:

你也可以试试这个

select t.product, t.price, version
 from table  t
 inner join
 (select product, max(version) maxVerion from table where
 'dategiven' between startdate and enddate group by product) temp
 on temp.product = t.product and t.version = temp.maxVerion

希望对你有帮助。

【讨论】:

【参考方案4】:

我的电脑安装的不是sqlservert,而是mysql。不知道是不是很复杂。

  select t.product, t.price, v.version 
  (
     select temp.product, max(temp.version) as version
     from 
     (
        select product, price, startDate, endDate, version 
        from Table
        where 'dategiven' between startDate and endDate
     ) as temp
     group by temp.product
  ) as v
  inner join Table as t
  on v.version = t.version

【讨论】:

以上是关于查询返回日期范围内的行,但只返回列的最大值的主要内容,如果未能解决你的问题,请参考以下文章

SQL在where语句中使用日期范围的选择子查询来确定该日期范围内的最大值

删除/隐藏 UIDatePicker 最小/最大日期范围之外的行?

使用 Pandas 查找列的最大值并返回相应的行值

使用 Oracle 查找任意日期范围内的行数

MySQL 聚合函数 和 分组查询(初级)

MySQL 聚合函数 和 分组查询(初级)