如何选择产品的最新价格?

时间:2019-02-13 11:51:43

标签: mysql sql

这是我的桌子:

+----+------------+-----------+---------------+
| 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列表,这些产品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

5 个答案:

答案 0 :(得分:3)

您可以使用相关子查询

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

答案 1 :(得分:1)

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                    
               )

答案 2 :(得分:0)

请勿使用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
               );

答案 3 :(得分:0)

假设您正在使用现代版本的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

答案 4 :(得分:0)

我的解决方案是使用解析函数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
相关问题