【问题标题】:find price difference for different date查找不同日期的价格差异
【发布时间】:2014-01-14 01:09:17
【问题描述】:

如何找到两个选定日期的价格差异。我的桌子如图所示

---------------------------------------
id      price      date        product
---------------------------------------
1       10         15-12-2013  pen
2       40         15-12-2013  book
3       15         16-12-2013  pen
4       42         16-12-2013  book
-------------------------------------

我想要一个 sql 查询来获取输出,例如,如果 startdate:15-12-2013 & enddate:16-12-2013

product  startdate(15-12-2013)  enddate(16-12-2013) difference
--------------------------------------------------------------
pen        10                      15                  5
book       40                      42                  2
--------------------------------------------------------------

【问题讨论】:

  • 如果特定产品的 startdate 或 enddate 不存在怎么办?您需要使用最新的已知价格吗?
  • IF(startdatePrice >= enddatePrice, startdatePrice - enddatePrice, enddatePrice - startdatePrice) 中的一些东西
  • 不是在数据库中存储日期的有效方法

标签: mysql sql select group-by difference


【解决方案1】:

也许是这样的?

select
        p1.product,
        p1.price,
        p2.price,
        p1.price - p2.price as diff
from
        product p1,
        product p2
where
        p1.product=p2.product and
        date(p1.date)='2013-12-15' and
        date(p2.date)='2013-12-16'

如果性能是一个问题,那么此链接可以为日期匹配部分提供更好的选择:MySQL SELECT WHERE datetime matches day (and not necessarily time)

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT product, StartDatePrice, EndDatePrice, (EndDatePrice - StartDatePrice) AS Difference 
    FROM (SELECT product, MAX(IF(a.date = '15-12-2013', a.price, 0)) AS StartDatePrice, 
                 MAX(IF(a.date = '16-12-2013', a.price, 0)) AS EndDatePrice 
          FROM tableA a 
          GROUP BY product
         ) AS A;
    

    【讨论】:

      【解决方案3】:

      如果您在价格变化时(而不是每天)在价格表中插入一行,则应考虑使用此查询:

      SELECT
        p1.product,
        p1.price as stardtade,
        p2.price as enddate,
        p2.price-p1.price as difference
      FROM
        prices p1 INNER JOIN (SELECT product, MAX(dt) max_dt
                              FROM prices
                              WHERE dt<='2013-12-15'
                              GROUP BY product) st
        ON p1.product=st.product AND p1.dt = st.max_dt
      
        INNER JOIN
      
        prices p2 
      
        ON p1.product=p2.product
      
        INNER JOIN (SELECT product, MAX(dt) max_dt
                              FROM prices
                              WHERE dt<='2013-12-16'
                              GROUP BY product) ed
        ON p2.product=ed.product AND p2.dt = ed.max_dt
      

      它更复杂,但即使您的表格中不存在某些日期,它也会起作用。在这种情况下,它将使用 lask 已知的价格值。

      请看小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 2019-11-17
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        相关资源
        最近更新 更多