SQL查找上次更改价格的日期

时间:2011-12-27 22:45:20

标签: sql

输入:

Date    Price

12/27    5
12/21    5
12/20    4
12/19    4
12/15    5

所需输出: 设定价格的最早日期与当前价格相比较。 例如,自 12/21 以来,价格一直是5。

答案不能是12/15,因为我们有兴趣找到价格与当前价格相同而不改变价值的最早日期(12月20日,价格已经变为4)

3 个答案:

答案 0 :(得分:2)

这应该是正确的。您没有提供表格结构或名称,所以......

DECLARE @CurrentPrice MONEY

SELECT TOP 1 @CurrentPrice=Price FROM Table ORDER BY Date DESC

SELECT MIN(Date) FROM Table WHERE Price=@CurrentPrice AND Date>(
    SELECT MAX(Date) FROM Table WHERE Price<>@CurrentPrice
)

在一个查询中:

SELECT MIN(Date) 
FROM Table 
WHERE Date >
      ( SELECT MAX(Date) 
        FROM Table 
        WHERE Price <> 
              ( SELECT TOP 1 Price 
                FROM Table 
                ORDER BY Date DESC
              )
      )

答案 1 :(得分:0)

这个问题没有任何意义所以我不能100%确定你的目标。

创建四列,old_price,new_price,old_date,new_date。

!如果old_price === new_price,只需打印old_date即可。

答案 2 :(得分:0)

您使用的数据库服务器是什么?如果是Oracle,我会使用他们的窗口函数。无论如何,这是一个在mysql中运行的快速版本:

以下是示例数据:

+------------+------------+---------------+
| date       | product_id | price_on_date |
+------------+------------+---------------+
| 2011-01-01 |          1 |             5 |
| 2011-01-03 |          1 |             4 |
| 2011-01-05 |          1 |             6 |
+------------+------------+---------------+

以下是查询(仅当您有1个产品时才有效 - 必须在where子句中添加“和product_id = ...”条件,否则)。

SELECT p.date as last_price_change_date
FROM test.prices p
left join test.prices p2 on p.product_id = p2.product_id and p.date < p2.date
where p.price_on_date - p2.price_on_date <> 0
order by p.date desc
limit 1

在这种情况下,它将返回“2011-01-03”。

不是一个完美的解决方案,但我相信它有效。但是,尚未对更大的数据集进行测试。

确保在date和product_id上创建索引,否则会使您的数据库服务器瘫痪并请求怜悯。

伯纳。