繁体   English   中英

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

[英]How do I select single row in a group based upon date?

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

任何想法都非常感谢。

尝试这个:

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

子查询将标识正确的行,主查询将再次获取行以获取价格。

您按日期按降序排列(以便最新记录“在最顶层”)并使用WHERE过滤掉您感兴趣的日期之后的日期。 LIMIT子句(在mySQL的情况下)使结果集只有一行。 所以查询会是这样的

SELECT *
  FROM tab
  WHERE(Number = ITEM1)AND(Date <= CURRENT_DATE)
ORDER BY Date DESC
FETCH FIRST 1 ROW ONLY

SELECT * FROM表WHERE日期> = '01 / 01/09'

尝试这个:

SELECT item_number, MAX(price_effective_date)
  FROM items_table
WHERE price_effective_date <  current_date 
    GROUP BY item_number

如果您使用的是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))

在这种情况下,它将输出:Item:Item1; 日期:01/01/2012; $ 250.00

我希望这就是你要找的东西。

如果它只是SQL你需要尝试

SELECT [columname price] FROM [tablename] WHERE EXTRACT(YEAR FROM CURDATE()) = EXTRACT(YEAR FROM [columname date] ) limit 1

[columname]替换为[columname]的名称保存数据

[tablename]替换为保存数据的表的名称

我相信应该这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM