【问题标题】:Get the max value from each group oracle从每个组oracle中获取最大值
【发布时间】:2020-03-03 10:30:39
【问题描述】:

我想根据以下记录中的ID_DATE 列获取每个组中的最高值。分组ID_TOPIC

CREATE TABLE DA_TBL(
    DATA_ID  VARCHAR2(50),
    REF_DESC VARCHAR2(50),
    DATE_L DATE NOT NULL,
    ID_TOPIC  VARCHAR2(50),
    ID_DATE NUMBER
);

INSERT all 
INTO DA_TBL  VALUES  ('1','sample 1',CURRENT_TIMESTAMP, 'local', 1)
INTO DA_TBL  VALUES  ('2','sample 2',CURRENT_TIMESTAMP, 'tradition', 2)
INTO DA_TBL  VALUES  ('3','sample 2',CURRENT_TIMESTAMP, 'gospel', 3)
INTO DA_TBL  VALUES  ('4','sample 4',CURRENT_TIMESTAMP, 'local', 4)
INTO DA_TBL  VALUES  ('5','sample 5',CURRENT_TIMESTAMP, 'gospel', 5)
INTO DA_TBL  VALUES  ('6','sample 6',CURRENT_TIMESTAMP, 'tradition', 6)
INTO DA_TBL  VALUES  ('7','sample 7',CURRENT_TIMESTAMP, 'gospel', 7)
INTO DA_TBL  VALUES  ('8','sample 8',CURRENT_TIMESTAMP, 'local', 8)
INTO DA_TBL  VALUES  ('9','sample 9',CURRENT_TIMESTAMP, 'tradition', 9)
INTO DA_TBL  VALUES  ('10','sample 10',CURRENT_TIMESTAMP, 'local', 10)
INTO DA_TBL  VALUES  ('11','sample 11',CURRENT_TIMESTAMP, 'gospel', 11)
SELECT * FROM dual;

我想要的是:

DATA_ID|REF_DESC |ID_TOPIC |ROWNUMBER|
-------|---------|---------|---------|
9      |sample 9 |tradition|        1|
10     |sample 10|local    |        1|
11     |sample 11|gospel   |        1|

我得到的是:

DATA_ID|REF_DESC|ID_TOPIC |ROWNUMBER|
-------|--------|---------|---------|
9      |sample 9|tradition|        1|
8      |sample 8|local    |        1|
7      |sample 7|gospel   |        1|

我尝试过的

 SELECT *
  FROM (SELECT DATA_ID, REF_DESC, ID_TOPIC 
              , ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY DATA_ID DESC) AS rownumber
         FROM  DA_TBL ORDER BY DATA_ID DESC)
 WHERE rownumber = 1;

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您的问题是DATA_ID 列的数据类型。它是一个字符串,字符串的排序方式与数字不同。 9 比 10“大”。

    如果可以,请将列的数据类型修改为NUMBER。

    或者,在这里申请TO_NUMBER:

    ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY TO_NUMBER(DATA_ID) DESC)
                                                      ------------------
                                                      here
    

    如果列包含 alpha数字值,这可能不起作用。

    SQL> l
      1  SELECT *
      2    FROM (SELECT DATA_ID, REF_DESC, ID_TOPIC
      3                , ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY to_number(DATA_ID) DESC) AS rownumber
      4           FROM  DA_TBL ORDER BY DATA_ID DESC)
      5*  WHERE rownumber = 1
    SQL> /
    
    DATA_ID REF_DESC   ID_TOPIC    ROWNUMBER
    ------- ---------- ---------- ----------
    9       sample 9   tradition           1
    11      sample 11  gospel              1
    10      sample 10  local               1
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      尝试以下查询:

      SELECT 
        t1.DATA_ID,
        t1.REF_DESC,
        t1.ID_TOPIC
      FROM yourTable t1
      JOIN (
        SELECT 
          ID_TOPIC, 
          MAX(ID_DATE) AS maxIdDate
        FROM yourTable 
        GROUP BY ID_TOPIC
      ) t2 ON t1.ID_TOPIC = t2.ID_TOPIC AND t1.ID_DATE = t2.maxIdDate
      

      我认为您在查询中使用了错误的列,因此如果您以这种方式修复它也应该可以工作:

      SELECT 
        *
      FROM (
        SELECT 
          DATA_ID, 
          REF_DESC, 
          ID_TOPIC,
          ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY ID_DATE DESC) AS rownumber
        FROM DA_TBL
      ) t
      WHERE rownumber = 1;
      

      【讨论】:

      • 你试过了吗?我得到SQL Error [918] [42000]: ORA-00918: column ambiguously defined
      • 很抱歉,我已经编辑了我的查询,现在应该可以使用了
      • 这仍然受到列data_id上的错误数据类型的影响
      • 我同意 data_id 不是一个数字,但我在这里使用 ID_DATE 这是一个数字“我想根据 ID_DATE 获得每个组中的最高值”
      【解决方案3】:

      这是因为您在 DATA_ID 上有 varchar 数据类型。

      为了正确的排序(你期望整数排序,而不是文本顺序),你需要转换它:

      ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY CAST(DATA_ID AS NUMBER) DESC)
      

      附注:您的表中的数据类型是错误的 - 如果您有一个 ID,它自然应该存储为一个数字(除非您有一些特殊要求)。

      根据您发布的内容,您将两个 ID 列存储为 varchar,它应该是 number。

      【讨论】:

      • 然后改变它,如果可以的话 - 它会真正回报你的未来。如您所见,这可能会导致问题...
      【解决方案4】:

      我想根据 ID_DATE 获得每个组中的最高值

      如果是这样,你为什么要关注DATA_ID?

      你想要的查询是:

      SELECT *
      FROM (SELECT DATA_ID, REF_DESC, ID_TOPIC ,
                   ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY ID_DATE DESC) AS rownumber
            FROM  DA_TBL
           )
      WHERE rownumber = 1
      ORDER BY TO_NUMBER(DATA_ID) DESC;
      

      Here 是一个 dbfiddle。

      【讨论】:

        猜你喜欢
        • 2017-04-17
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 2010-09-16
        • 2020-12-31
        • 1970-01-01
        相关资源
        最近更新 更多