如何根据日期选择组中的单行?
Posted
技术标签:
【中文标题】如何根据日期选择组中的单行?【英文标题】:How do I select single row in a group based upon date? 【发布时间】:2011-08-03 20:07:57 【问题描述】:我们有一个商品价格文件,其中包含商品编号、价格生效日期和价格。 我们将在今年年初涨价。我要做的是现在添加价格记录,该价格记录将具有较晚的生效日期,并根据当前日期选择当前价格。 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
一旦今年的第一天 - 01/01/12,我会选择 01/01/12 记录。
您不能使用 MIN 或 MAX 函数,因为它会提取第一条或最后一条记录,而不是正确的记录。
非常感谢任何想法。
【问题讨论】:
对不起...我在 AS400 上使用 DB2。 @Frederick:更新了我的答案以反映 DB2 current_date 【参考方案1】:试试这个:
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
子查询将识别正确的行,主查询将再次获取该行以获取价格。
【讨论】:
【参考方案2】:SELECT * FROM Table WHERE Date >= '01/01/09'
【讨论】:
这会选择所有大于 01/01/09 的记录,我想要单行。【参考方案3】:如果您使用的是 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;日期:2012 年 1 月 1 日; $250.00
我希望这就是你要找的。p>
【讨论】:
没关系,自从我开始写答案以来,您的问题发生了很大变化。我现在的回答对你来说毫无意义。对不起【参考方案4】:如果只是 SQL 你需要尝试
SELECT [columname price] FROM [tablename] WHERE EXTRACT(YEAR FROM CURDATE()) = EXTRACT(YEAR FROM [columname date] ) limit 1
将[columname]
替换为持有数据的柱女巫的名字
将[tablename]
替换为持有数据的表名
我相信这应该可以解决问题。
【讨论】:
【参考方案5】:您按日期降序排列(以便最新记录在“最上面”),并使用WHERE
过滤掉您要求的日期之后的日期。 LIMIT 子句(在 mysql 的情况下)使结果集只有一行。所以查询会是这样的
SELECT *
FROM tab
WHERE(Number = ITEM1)AND(Date <= CURRENT_DATE)
ORDER BY Date DESC
FETCH FIRST 1 ROW ONLY
【讨论】:
@kuru 不,这就是LIMIT
的用途——只返回一行。
我知道......但我想我的意思是,你不知道它会抓住哪一个。
@kuru 由于order by
,它将获取“current_date”之前的最新日期
但 LIMIT 不是 DB2 中的有效函数,收到语法错误。
@Frederik 我将其更新为使用 FETCH FIRST 1 ROW ONLY
- 您没有在问题中提及您的数据库引擎!【参考方案6】:
试试这个:
SELECT item_number, MAX(price_effective_date)
FROM items_table
WHERE price_effective_date < current_date
GROUP BY item_number
【讨论】:
这是成功的!!!非常感谢。我知道我错过了一些东西。代码有点复杂,因为日期以 CYYMMDD 格式存储,我还必须将转换放在 select 语句中,这就是我遇到困难的原因。以上是关于如何根据日期选择组中的单行?的主要内容,如果未能解决你的问题,请参考以下文章