简体   繁体   English

获取每个组oracle的最大值

[英]Get the max value from each group oracle

I want to get the top value in each group based on ID_DATE column from the following record.我想根据以下记录中的ID_DATE列获取每个组中的最高值。 Group by ID_TOPICID_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;

What I want is:我想要的是:

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

What I get is:我得到的是:

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

What I have tried我试过的

 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;

Your problem is DATA_ID column's datatype.您的问题是DATA_ID列的数据类型。 It is a string, and strings are sorted differently than numbers.它是一个字符串,字符串的排序方式与数字不同。 9 is "larger" than 10. 9 比 10“大”。

If you can, modify column's datatype to NUMBER .如果可以,请将列的数据类型修改为NUMBER

Or, apply TO_NUMBER here:或者,在此处申请TO_NUMBER

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

This might not work if column contains alpha numeric values.如果列包含字母数字值,这可能不起作用。

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>

Try the following query :尝试以下查询:

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

I think you used the wrong column in your query, so it should also work if you fix it this way :我认为您在查询中使用了错误的列,因此如果您以这种方式修复它,它也应该有效:

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;

This is because you have varchar datatype on DATA_ID .这是因为您在DATA_ID上有varchar数据类型。

For correct ordering (you expect integer ordering, not a text order), you need to cast it:为了正确排序(您期望整数排序,而不是文本顺序),您需要转换它:

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

Side note: datatypes in your tables are wrong - if you have an ID, it naturally should be stored as a number (unless you have some special requirements).旁注:表中的数据类型是错误的——如果你有一个 ID,它自然应该存储为一个数字(除非你有一些特殊要求)。

From what you posted, you store two ID columns as varchar , it should be number instead.根据您发布的内容,您将两个 ID 列存储为varchar ,它应该是number

I want to get the top value in each group based on ID_DATE我想根据 ID_DATE 获取每个组中的最高值

If so, why are you focusing on DATA_ID ?如果是这样,你为什么关注DATA_ID

The query you want is:你想要的查询是:

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 is a db<>fiddle. 是一个 db<>fiddle。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM