获取每个日期的最接近记录

时间:2010-11-25 13:52:49

标签: sql mysql

我正在尝试为表skucompetition中的每个日期创建一个返回表creationdateformat的所有价格的查询。

为了澄清,creationdateformat中包含以下日期:

creationdateformat
2010-10-25
2010-10-26
2010-11-10
2010-11-24
2010-11-25

skucompetition有这些价格:

sku              creationdate           price
PCR-BR2495112   2010-10-26 16:06:03    24.99
PCR-BR2495112   2010-11-10 13:01:43    27.99
PCR-BR2495112   2010-11-25 12:24:26    26.51

对于2010-10-25日期,它应该返回0,就像第一个价格存在之前一样。

对于2010-10-26日期,它应该返回24,99

对于2010-11-10和2010-11-24的日期,它应该返回27.99

对于2010-11-25日期,它应该返回26.51

等等。

如何才能最好地实现这一目标?

3 个答案:

答案 0 :(得分:1)

这应该指向正确的方向......

根据您的示例数据判断,您需要在特定日期之前或之后 中查找最新记录。

您只对单个记录感兴趣,因此您应该limit选择第一条记录。

您可以简化之前或之后部分。 “今天之前或之后”的任何事情都与“明天之前”的事情相同。因此,您将在输入日期plus one day之前寻找任何内容。这简化了查询,因为您不必担心一天中的确切时间。

最后,为了确保您获得最新记录,您必须order记录。

在伪代码中它将是:

select the first record
from skucompetition
where creationdate is before (input date + one day)
order by creationdate so most recent record comes first

您应该处理在您的应用程序中返回0的特殊情况。如果您已正确构造查询,则它将不会匹配第一个日期之前的输入日期的任何记录。那时你的应用程序应该处理'return 0'的情况。

答案 1 :(得分:0)

我会创建一个查询:

  • 选择创建日期的所有记录,或者晚于您正在查看的日期
  • 从最早到最新订购​​
  • 然后使用“限制”仅返回第一条记录

确切的语法当然取决于您使用的RDBMS

答案 2 :(得分:0)

SELECT price FROM skucompetition
WHERE sku = "<sku>" AND DATE(creationdate) <= "<date>"
ORDER BY date DESC LIMIT 1

这将选择具有正确SKU且不早于“date”的第一条记录。如果没有,则返回NULL。