如何选择产品的最新价格? [复制]

Posted

技术标签:

【中文标题】如何选择产品的最新价格? [复制]【英文标题】:How to select the latest price for product? [duplicate] 【发布时间】:2019-02-13 11:51:43 【问题描述】:

这是我的桌子:

+----+------------+-----------+---------------+
| id | product_id |   price   |     date      |
+----+------------+-----------+---------------+
| 1  | 4          | 2000      | 2019-02-10    |
| 2  | 5          | 1600      | 2019-02-11    |
| 3  | 4          | 850       | 2019-02-11    |
| 4  | 5          | 1500      | 2019-02-13    |
+----+------------+-----------+---------------+

我需要获取最新的唯一产品 ID 列表(最新的,换句话说,更大的 date)。所以这是预期的结果:

+------------+-----------+---------------+
| product_id |   price   |     date      |
+------------+-----------+---------------+
| 4          | 850       | 2019-02-11    |
| 5          | 1500      | 2019-02-13    |
+------------+-----------+---------------+

知道如何实现吗?


这是我的查询:

SELECT id, product_id, price, MAX(date)
FROM tbl
GROUP BY product_id
-- ot selects the max `date` with random price like this:
    +------------+-----------+---------------+
    | product_id |   price   |     date      |
    +------------+-----------+---------------+
    | 4          | 2000      | 2019-02-11    |
    | 5          | 1600      | 2019-02-13    |
    +------------+-----------+---------------+
-- See? Prices are wrong

【问题讨论】:

哪个 mysql 版本? 也许这可以帮助你:***.com/questions/5191503/…问候 【参考方案1】:

您可以使用相关子查询

select t1.* from table t1
where t1.date=( select max(date) from table t2
where t1.product_id=t2.product_id
            )

【讨论】:

【参考方案2】:
Select *from
table1 t1
where (t1.product_id, t1.date) in 
               (select t2.product_id, max(t2.date)
                from table1 t2
                where t1.product_id = t2.product_id                    
               )

【讨论】:

您可以通过删除子查询中的where子句来删除相关性并使用group by product_id 是的,我可以这样做,也可以从内部查询中删除 group by。我已经做了后面的。但是你认为哪一个更好?【参考方案3】:

不要使用GROUP BY。使用过滤器

SELECT id, product_id, price, MAX(date)
FROM tbl
WHERE tbl.date = (SELECT MAX(t2.date)
                  FROM tbl t2
                  WHERE t2.product_id = tbl.product_id
                 );

(product_id, date) 上有索引,这可能是最快的方法。

如果您可以在给定日期有重复,您可以通过以下方式解决它们:

SELECT id, product_id, price, MAX(date)
FROM tbl
WHERE tbl.id = (SELECT t2.id
                FROM tbl t2
                WHERE t2.product_id = tbl.product_id
                ORDER BY t2.date DESC
                LIMIT 1
               );

【讨论】:

【参考方案4】:

我的解决方案是使用解析函数first_value

SELECT distinct product_id, 
    first_value(price) over (partition by product_id order by date desc) last_price, 
    first_value(date) over (partition by product_id order by date desc) last_date
FROM tbl

【讨论】:

【参考方案5】:

假设您使用的是现代版本的 MySQL (8.0),您可以使用这个:

select *
from (
        SELECT id
            , product_id
            , price
            , date
            , row_number() over (partition by product_id order by date desc) rn
        FROM tbl
) a
where rn = 1

【讨论】:

以上是关于如何选择产品的最新价格? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何选择适合自己的韩国服务器?

您如何选择最新日期的值? [复制]

添加将更改 Woocommerce 简单产品中价格的选择字段

带你正确选择适合自己的韩国服务器!

如何根据用户角色(尤其是可变产品)显示不同的产品价格? [复制]

如何使用 RxJava 对来自异步源的数据进行分组