我们有一个商品价格文件,包含商品编号,价格生效日期和价格。 我们将在今年年初提价。我想要做的是现在添加具有较晚生效日期的价格记录,并根据当前日期选择当前价格。 I.E.当前日期是08/03/11,我想提取ITEM1 01/01/09记录:
1. ITEM1 01/01/01 100.00
2. ITEM1 01/01/05 150.00
3. ITEM1 01/01/09 200.00
4. ITEM1 01/01/12 250.00
一旦今年的第一次命中 - 2012年1月1日,我会选择01/01/12记录。
您不能使用MIN或MAX功能,因为它会拉出第一个或最后一个记录,而不是正确的记录。
非常感谢任何想法。
答案 0 :(得分:4)
试试这个:
select * from tb
join (
select tb.item,
MAX(tb.effDate) effDate
from tb
where tb.effDate <= currentDate
group by tb.item
) tmp
on tb.item = tmp.item
and tb.effDate = tmp.effDate
子查询将识别正确的行,主查询将再次获取该行以获取价格。
答案 1 :(得分:0)
您按日期排序,按降序排列(以便最新记录为“在最前面”)并使用WHERE
过滤掉您感兴趣的日期之后的日期。 LIMIT子句(在mySQL的情况下)使结果集只有一行。所以查询就像
SELECT *
FROM tab
WHERE(Number = ITEM1)AND(Date <= CURRENT_DATE)
ORDER BY Date DESC
FETCH FIRST 1 ROW ONLY
答案 2 :(得分:0)
SELECT * FROM Table WHERE Date&gt; = '01 / 01/09'
答案 3 :(得分:0)
试试这个:
SELECT item_number, MAX(price_effective_date)
FROM items_table
WHERE price_effective_date < current_date
GROUP BY item_number
答案 4 :(得分:0)
如果您使用的是VB.NET,这可能非常简单。看起来您的字段由单个''(空格)分隔。这会给你这样的东西:
Dim Record As String = "ITEM1 01/01/01 100.00 ITEM1 01/01/05 150.00 ITEM1 01/01/09 200.00 ITEM1 01/01/12 250.00"
Dim Fields() As String = Record.Split(" ")
Dim LastItemNo As String = Fields(Ubound(Fields) - 2)
Dim LastDate As Date = Date.Parse(Fields(Ubound(Fields) - ))
Dim LastPrice As Single = Val(Fields(Ubound(Fields)))
Debug.WriteLine("Item: " & LastItemNo & "; Date: " & Format(LastDate, "MM-dd-yyyy") & "; $" & Math.Round(LastPrice, 2))
在这种情况下,它会输出: 货号:第1项;日期:01/01/2012; $ 250.00
我希望这就是你要找的东西。
答案 5 :(得分:0)
如果它只是SQL,你需要尝试
SELECT [columname price] FROM [tablename] WHERE EXTRACT(YEAR FROM CURDATE()) = EXTRACT(YEAR FROM [columname date] ) limit 1
将[columname]
替换为colum的名称,其中包含数据
将[tablename]
替换为包含数据的表的名称
我相信应该这样做。