【问题标题】:retrieve max date record out of group of records从记录组中检索最大日期记录
【发布时间】:2015-02-16 08:46:20
【问题描述】:

我有以下 oracle 表,其中包含以下 3 列。如您所见,我有相同的contract_number 与不同的卡号和不同的date_open 相关。我需要检索每个 contract_number 的最大日期

CONTRACT_NUMBER CARD_NUMBER DATE_OPEN 009-P-0000202 1236547896542145 2012 年 11 月 23 日 009-P-0000202 5555666644441111 2014 年 6 月 20 日 009-P-0000202 6655225544665878 2014 年 6 月 25 日 009-P-008880 9666998775458789 2011 年 5 月 16 日 009-P-008880 4561637899876435 2013 年 1 月 22 日 009-P-0010873 6456879413185467 2013 年 5 月 14 日 009-P-0200749 5000223365521456 2013 年 2 月 28 日 009-P-098538 1000222266669870 12/19/2011 009-P-098538 1000222266665555 2012 年 3 月 22 日 009-P-098538 1000222266667777 2012 年 7 月 27 日 009-P-098538 1000222266669995 2/27/2013 009-P-098538 1000222266663333 2013 年 3 月 22 日 009-P-098538 1000222266661222 2013 年 4 月 18 日 009-P-098538 1000222266667567 2013 年 7 月 26 日 009-P-098538 1000222266669876 2014 年 1 月 10 日 009-P-098538 1000222266664456 2014 年 6 月 13 日 009-P-098538 1000222266663345 2014 年 8 月 19 日 009-P-098538 1000222266662321 2014 年 12 月 5 日

所需的结果应如下所示:

CONTRACT_NUMBER CARD_NUMBER DATE_OPEN 009-P-0000202 6655225544665878 2014 年 6 月 25 日 009-P-008880 4561637899876435 2013 年 1 月 22 日 009-P-0010873 6456879413185467 2013 年 5 月 14 日 009-P-0200749 5000223365521456 2013 年 2 月 28 日 009-P-098538 1000222266662321 2014 年 12 月 5 日

感谢您的意见

【问题讨论】:

  • Oracle group part of row and get row with latest timestamp 的可能重复项(查看第二个答案)
  • @Peter Lang:他没有指定他需要显示哪些卡号值......我们也不能从“预期结果”中暗示。问题定义仅声明“我需要检索每个合同号的最大日期”)。
  • 如果你需要CONTRACT_NUMBER每组中DATE_OPEN最大的那一行,请看我的回答。

标签: sql oracle max


【解决方案1】:

如果我理解你的问题,看起来你是在一个简单的 group by 之后。

SELECT t.Contract_Number,
       MAX(t.card_number) as MaxCardNumber,
       MAX(t.Date_Open) as maxDate
FROM yourTableName t
GROUP BY t.Contract_Number

请注意,您还将获得最大卡号。如果您想获得仅按合同号分组的列表,您还必须对卡号应用聚合函数。

【讨论】:

  • MAX(t.card_number) as MaxCardNumber, MAX(t.Date_Open) as maxDate 中存在拼写错误
  • 这是什么?表格字段是合同编号、卡片编号和日期打开
  • MaxCardNumber之后的答案中缺少逗号
  • 只是为了语言纯粹主义,它不是一个类型,而是一个语法错误:-)
  • 如果 OP 想要每组卡号中最大日期的行,那么这个答案会给出不正确的结果。因为,max(t.cardnumber) 也会获取最大卡号。
【解决方案2】:

您可以使用 ROW_NUMBER 解析函数。

WITH DATA AS(
SELECT t.*,
              ROW_NUMBER() OVER (PARTITION BY CONTRACT_NUMBER     
                                     ORDER BY DATE_OPEN DESC) AS rn
         FROM my_table t
)
SELECT CONTRACT_NUMBER, CARD_NUMBER, DATE_OPEN
FROM DATA 
WHERE rn = 1
/

mytable 替换为您的实际表名。

【讨论】:

    【解决方案3】:
    SELECT *
    FROM   table_name
    WHERE  date_open IN (SELECT MAX(date_open)
                         FROM   table_name
                         GROUP BY
                                CONTRACT_NUMBER
                         ORDER BY
                                date_open DESC)
    ORDER BY
           date_open DESC
    

    【讨论】:

    • 您的子查询错误。它会抛出ORA-00979: not a GROUP BY expression
    • 从子选择中删除无效的ORDER BY,它将执行。 (但返回错误的结果...)
    【解决方案4】:

    使用子查询查找每个 CONTRACT_NUMBER 的 MAX 日期:

    select * from table t1
    where DATE_OPEN = (select max(DATE_OPEN) from table t2
                       where t1.CONTRACT_NUMBER = t2.CONTRACT_NUMBER)
    

    如果一个最大日期有多个 CONTRACT_NUMBER 行,则将全部返回。

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多