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

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 语句中,这就是我遇到困难的原因。

以上是关于如何根据日期选择组中的单行?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据sql中组中的日期集获取前7天的数据

golang怎么对日期和时间进行排序

仅从组中选择第一行的 SQL 模式

如何根据 MySQL 中的最大日期仅选择左表的一条记录?

根据 Angular 中的日期列表突出显示日期选择器中的日期

如何根据 PHP 数据库中的结果在 jQuery 日期选择器上禁用一周中的某些天