我想从以下记录中基于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;
答案 0 :(得分:2)
您的问题是DATA_ID
列的数据类型。它是一个字符串,并且字符串的排序方式不同于数字。 9比10“大”。
如果可以,请将列的数据类型修改为NUMBER
。
或者在此处应用TO_NUMBER
:
ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY TO_NUMBER(DATA_ID) DESC)
------------------
here
如果列包含字母数字值,则此方法可能无效。
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>
答案 1 :(得分:1)
尝试以下查询:
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;
答案 2 :(得分:1)
这是因为您在varchar
上拥有DATA_ID
数据类型。
要正确排序(您希望整数排序,而不是文本顺序),则需要进行强制转换:
ROW_NUMBER() OVER (PARTITION BY ID_TOPIC ORDER BY CAST(DATA_ID AS NUMBER) DESC)
旁注:表中的数据类型是错误的-如果您有ID,则自然应将其存储为数字(除非您有特殊要求)。
根据您发布的内容,您将两个ID列存储为varchar
,而应该是number
。
答案 3 :(得分:1)
我想根据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是db <>小提琴。