当前位置: 首页 > 面试题库 >

使用where子句中的select max()函数改进Sql查询

党源
2023-03-14
问题内容

此查询的目的是带回产品及其在售产品的价格,价格应从最接近但不等于传入日期的日期开始,本质上是最近的可用价格。没有每天的价格记录。在where子句中使用聚合select语句有些不对劲。有一个更好的方法吗?也许在加入标准中?

        select  
        p.ProductName,
        pp.Price,
        pp.Date,
        from product p
        inner join productprice pp  on p.productid = pp.productid
        where 
        pp.evaluationdate = (select  max(Date) from productprice 
                             where productid = p.productid  
                             and date < @DateIn) 
        and p.producttype = 'OnSale'

实际查询稍微复杂一些,但这本质上是问题。感谢您的输入。

编辑 将返回不止一种产品

编辑 我正在尝试@Remus Rusanu和@km的建议(尽管@Remus
Rusanu删除了他的建议),包括我的原始三个,在性能方面似乎都差不多。我试图确定一个人是否以某种其他无形的方式(例如维护,自我记录等)比其他人受益,因为这将由其他人维护。再次感谢。


问题答案:

试试这个:

;WITH CurrentPrice AS 
(
SELECT productid,max(Date) AS Date
    FROM productprice 
    WHERE date < @DateIn 
    GROUP BY productid
)

select  
    p.ProductName,
    pp.Price,
    pp.Date,
    from product p
        inner join CurrentPrice pa  on p.productid = pa.productid
        inner join productprice pp  on pa.productid = pp.productid AND pa.Date=pp.Date
    where p.producttype = 'OnSale'

*根据OP的评论进行 *编辑

我认为上述带有CTE的查询将具有与@RemusRusanu派生表版本相同的查询计划

但是,如果productprice表很大,您可能希望通过用“ OnSale”进行过滤来减少它,如下所示:

;WITH CurrentPrice AS 
(
select  
    p.productid,
    MAX(pp.Date) AS Date
    from product p
        inner join productprice pp  on pa.productid = pp.productid
    where p.producttype = 'OnSale' AND pp.date < @DateIn 
    GROUP BY productid
)
select  
    p.ProductName,
    pp.Price,
    pp.Date,
    from CurrentPrice           pa
        inner join product      p   on pa.productid = p.productid
        inner join productprice pp  on pa.productid = pp.productid AND pa.Date=pp.Date
    where p.producttype = 'OnSale'


 类似资料:
  • 问题内容: 这是我的项目表 这是我的发货表 我想为提供最小数量的项目命名。 我试过了。但是它只返回最小数量值,这是我的代码 问题答案:

  • 问题内容: 我想知道这在sql(使用php作为服务器端)中实际上可行,在其中您有一个值数组(数字),然后尝试根据该数组中的值检索数据。 我有一个SQL表: 我现在写一个查询来检索“帖子”: 是否有任何sql内置函数来检查数组中的值?还是应该为此使用PHP? 我实际上是在尝试实现Twitter模式,以显示我们关注的人的帖子。 问题答案: SQL无法解析PHP数组。试试这个:

  • WHERE 子句用于过滤记录。 SQL WHERE 子句 WHERE 子句用于提取那些满足指定标准的记录。 SQL WHERE 语法SELECT column_name,column_name FROM table_name WHERE column_name operator value; 演示数据库 在本教程中,我们将使用 RUNOOB 样本数据库。 下面是选自 "Websites" 表的数据

  • 问题内容: 我想使用in子句,但它返回错误。 我可以在where子句中使用CASE吗?或如何解决?谢谢 问题答案: 就您而言,您只需要OR 一种情况是针对 值 ,而不是条件。条件在CASE表达式之外 例如

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 问题内容: 我在某处看到此查询- 什么是 “N” 是什么意思?我不确定这是否仅对SQL Server有效。 问题答案: N代表“国家字符”,它表示字符串的内容为Unicode。 只要碰到专有名称或其他可能包含默认ASCII字符集以外的字符的实体,就应该使用Unicode(/ )。如果不使用前缀将此类字符串括起来,则会丢失数据。例如: 结果: 您还应确保在您或其他子句中对列使用前缀。不使用前缀时,由