[英]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.