使用特定逻辑从连接表中获取最大值
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_discount
或price_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
【讨论】:
以上是关于使用特定逻辑从连接表中获取最大值的主要内容,如果未能解决你的问题,请参考以下文章