我有一张表code_prices
看起来像这样:
CODE | DATE | PRICE
ABC | 25-7-2011 | 2.81
ABC | 23-7-2011 | 2.52
ABC | 22-7-2011 | 2.53
ABC | 21-7-2011 | 2.54
ABC | 20-7-2011 | 2.58
ABC | 17-7-2011 | 2.42
ABC | 16-7-2011 | 2.38
数据集的问题是日期有差距,所以我可能想在18日查找项目ABC的价格,但没有条目,因为该项目在此日期尚未售出。所以我想以最优惠的价格返回最新的heotrical条目。
如果我在日期19-7-2011查询,我想在17日返回条目,然后返回下10个可用条目。
但是,如果我在20日查询ABC的价格,我会想要在20日之后返回价格以及之后的10个价格......
在SQL语句或使用存储过程中,最有效的方法是什么。
我可以想到只编写一个存储过程,它将日期作为参数,然后查询所有行,其中DATE> = QUERY-DATE按日期排序,然后选择11项(通过限制)。然后基本上我需要看看该集合是否包含当前日期,如果它然后返回,否则我将需要从这11个中返回10个最近的entires并且还在表格上执行另一个查询以通过获取返回先前的条目日期的最大日期<查询日期。我想可能有更好的方法,但我不是SQL专家(显然)......
谢谢!
答案 0 :(得分:2)
我不清楚你想要达到什么目标,但无论如何我都会去。这将搜索包含小于或等于指定日期的日期的行的ID。然后,它使用该ID返回ID大于或等于该值的所有行。它假定您有一个除日期列以外的列,可以在其上订购行。这是因为你说日期是非线性的 - 我假设你必须有其他方式来排序行。
SELECT id, code, dt, price
FROM code_prices
WHERE id >= (
SELECT id
FROM code_prices
WHERE dt <= '2011-07-24'
ORDER BY dt DESC
LIMIT 1 )
ORDER BY id
LIMIT 11;
替代代码条件 - 感谢@ypercube突出显示; - )
SELECT id, code, dt, price
FROM code_prices
WHERE code = 'ABC'
AND id >= (
SELECT id
FROM code_prices
WHERE dt <= '2011-07-23'
AND code = 'ABC'
ORDER BY dt DESC
LIMIT 1 )
ORDER BY id
LIMIT 11;
答案 1 :(得分:2)
这是针对一个特定代码:
SELECT code, `date`, price
FROM code_prices
WHERE code = @inputCode
AND `date` >=
( SELECT MAX(`date`)
FROM code_prices
WHERE code = @inputCode
AND `date` <= @inputDate
)
ORDER BY `date`
LIMIT 11
对于ABC
和19-7-2011
,您将在上面给出17-7-2011
行和后续10行(20-7-2011
,21-7-2011
等)< / p>