如何根据日期选择组中的单行?

时间:2011-08-03 20:07:57

标签: sql db2 db2-400

我们有一个商品价格文件,包含商品编号,价格生效日期和价格。 我们将在今年年初提价。我想要做的是现在添加具有较晚生效日期的价格记录,并根据当前日期选择当前价格。 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功能,因为它会拉出第一个或最后一个记录,而不是正确的记录。

非常感谢任何想法。

6 个答案:

答案 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]替换为包含数据的表的名称

我相信应该这样做。