Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL来查找上次更改价格的日期_Sql - Fatal编程技术网

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

SQL来查找上次更改价格的日期,sql,Sql,输入: 所需输出: 与当前价格相比设定价格的最早日期。 例如,自12/21以来,价格一直为5 答案不可能是2015年12月,因为我们希望找到最早的日期,即价格与当前价格相同但价值不变的日期。20年12月,价格已更改为4,这应该是正确的。您没有提供表结构或名称,因此 Date Price 12/27 5 12/21 5 12/20 4 12/19 4 12/15 5 在一个查询中: DECLARE @CurrentPrice MONEY SELECT TO

输入:

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


答案不可能是2015年12月,因为我们希望找到最早的日期,即价格与当前价格相同但价值不变的日期。20年12月,价格已更改为4,这应该是正确的。您没有提供表结构或名称,因此

Date    Price

12/27    5
12/21    5
12/20    4
12/19    4
12/15    5
在一个查询中:

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
)

这个问题毫无意义,所以我不能100%确定你想要什么

创建四列,旧价格、新价格、旧日期、新日期


!!如果旧的价格===新的价格,只需打印旧的日期即可

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

以下是示例数据:

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个产品时有效-将必须添加一个和产品\u id=。。。如果另有规定,则以where条款为条件

+------------+------------+---------------+
| date       | product_id | price_on_date |
+------------+------------+---------------+
| 2011-01-01 |          1 |             5 |
| 2011-01-03 |          1 |             4 |
| 2011-01-05 |          1 |             6 |
+------------+------------+---------------+
在这种情况下,它将返回2011-01-03

这不是一个完美的解决方案,但我相信它是有效的。不过,我们还没有在更大的数据集上进行测试

确保在日期和产品id上创建索引,否则会使数据库服务器屈服并乞求宽恕


Bernardo。

我假定您假定它是从OP的名称为SQL Server编写的。对吗?Price=@CurrentPrice也可以删除。@ypercube-我根据OP前面的问题假设了SQL Server。您的查询几乎肯定会执行得更好,但我通常会避免使用嵌套查询,尤其是在示例中。我没有将MAXDate嵌套转换为单独查询的唯一原因是我不知道日期的数据类型。
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