【问题标题】: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 sql


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2018-04-26
          • 2013-01-14
          • 2015-04-22
          • 1970-01-01
          • 2015-03-24
          • 2019-10-29
          • 2014-02-17
          • 1970-01-01
          • 2017-12-05
          相关资源
          最近更新 更多