使用特定逻辑从连接表中获取最大值

Posted

技术标签:

【中文标题】使用特定逻辑从连接表中获取最大值【英文标题】:Getting Max Value From Joined Table With Certain Logic 【发布时间】:2015-08-11 01:00:25 【问题描述】:

这是我的表关系:

tbl_product
-----------
product_id

tbl_product_price
-----------------
price_id
price_product_id (FK)
price_normal 
price_discount
price_disc_valid_from_date 
price_disc_valid_to_date

我想查询 tbl_product,按其最高价格 DESC 排序,必须先验证。如果折扣日期仍然有效(price_disc_valid_from_date AND price_disc_valid_to_date 之间的当前日期),则获取price_discount。如果无效,则获取price_normal。之后我需要获得最高价格(来自price_discountprice_normal),然后按最高价格订购。

this 之类的大部分问题只是如何选择最大列,不需要先对连接表进行验证。

我的问题是,该查询的 postgres sql 语句是什么?谢谢

[编辑]

我坚持从tbl_product_price 表中选择最高价格,但不知道如何加入tbl_product

SELECT 
    pr.price_id, pr.product_price_id, 
    CASE WHEN current_date BETWEEN pr.price_disc_valid_from_date AND pr.price_disc_valid_to_date 
        THEN pr.price_discount 
        ELSE pr.price_normal END AS price 
    FROM tbl_product_price pr 
    WHERE pr.price_product_id = 316 
    GROUP BY pr.price_id, pr.price_product_id 
    ORDER BY price DESC 
    LIMIT 1;

【问题讨论】:

我相信你应该看看case声明:postgresql.org/docs/9.4/interactive/… 您应该在问题中包含代码,而不是在 cmets 中。 Arion 的回答能满足你的需要吗? 一个产品可以有多个价格和多个折扣,你想按照你描述的逻辑按最高价格订购,但不管产品是否打折?你能展示一些样本数据和想要的结果吗? 【参考方案1】:

你可以这样做吗:

SELECT
    tbl_tbl_product.price_product_id,
    tblMax.MaxPrice
FROM
    tbl_tbl_product
    JOIN
    (
        SELECT
            tbl_product_price.price_product_id, 
            MAX(
                CASE 
                    WHEN now() BETWEEN
                               tbl_product_price.price_disc_valid_from_date 
                               AND tbl_product_price.price_disc_valid_to_date
                    THEN tbl_product_price.price_discount
                    ELSE tbl_product_price.price_normal
                END
            ) AS MaxPrice  
        FROM
            tbl_product_price
        GROUP BY
            tbl_product_price.price_product_id
    ) as tblMax
    ON tblMax.price_product_id=tbl_tbl_product.product_id
ORDER BY
    tblMax.MaxPrice DESC

【讨论】:

连接内的子选择是不必要的,它引入了复杂性。你可以重写查询来避免它。 @RadekPostołowicz:是的,我知道。但如果操作在产品表中有更多列,则不会。这不是问题的一部分【参考方案2】:

如果我正确理解您的逻辑,则此查询应返回按产品最高价格订购的产品:

SELECT
  tp.product_id
FROM
  tbl_product tp INNER JOIN tbl_product_price tpp
  ON tb.product_id = tpp.price_product_id
GROUP BY
  tp.product_id
ORDER BY
  MAX(CASE WHEN current_date BETWEEN tpp.price_disc_valid_from_date
                             AND tpp.price_disc_valid_to_date THEN
      tpp.price_discount
    ELSE
      tpp.price_normal END) DESC

【讨论】:

以上是关于使用特定逻辑从连接表中获取最大值的主要内容,如果未能解决你的问题,请参考以下文章

根据Excel中的逻辑从2列中检索最大数据

从另一个表中获取用户的最大日期

如何从不同的表中获取最大版本并加入表?

使用 LINQ 获取连接表中的最大计数

从休眠表中获取最大值记录

DB2 和 SQL-如何在特定字段中返回最大值,以便每行只显示一条记录;从多个表中提取数据