Oracle 复杂行分区
我有个问题,我想不出怎么做。但首先,我将向您展示表格示例。真正的问题要复杂得多。但让我们回到问题上来Oracle 复杂行分区,oracle,rows,partitioning,Oracle,Rows,Partitioning,我有个问题,我想不出怎么做。但首先,我将向您展示表格示例。真正的问题要复杂得多。但让我们回到问题上来 select id, value, value2, date from boards ID VALUE VALUE2 DATE 1 A Z 2014 2 A Z 2015 3 B Z 2015 4 B C 2015 5 A
select id, value, value2, date from boards
ID VALUE VALUE2 DATE
1 A Z 2014
2 A Z 2015
3 B Z 2015
4 B C 2015
5 A Z 2016
日期不重要(它仅用于正确的行顺序)。执行查询时得到的结果。这不是我想要的结果
SELECT a.
FROM SELECT id,
VALUE,
value2,
DATE,
row_number() over(PARTITION BY VALUE, value2 ORDER BY DATE) ranking
FROM boards)
WHERE a.ranking = 1
ID VALUE VALUE2 DATE
1 A Z 2014
3 B Z 2015
4 B C 2015
输出是正确的。但这不是我想要的结果。我希望它是这样的:
ID VALUE VALUE2 DATE
1 A Z 2014
3 B Z 2015
4 B C 2015
5 A Z 2016
有没有办法,我可以得到我想要的结果?使用其他函数,生成复杂的逻辑。所有建议将不胜感激:)使用Tabibitosan技术。我假设您已经从日期列中提取了年份。但是,即使使用整个日期,逻辑仍然是一样的 Oracle 11g R2架构设置:
CREATE TABLE boards
(ID int, VALUE1 varchar2(1), VALUE2 varchar2(1), DATE_t int)
;
INSERT ALL
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (1, 'A', 'Z', 2014)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (2, 'A', 'Z', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (3, 'B', 'Z', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (4, 'B', 'C', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (5, 'A', 'Z', 2016)
SELECT * FROM dual
;
SELECT MIN (ID) AS ID,
VALUE1,
VALUE2,
MIN (DATE_T) as "DATE"
FROM (SELECT b.*,
ROW_NUMBER () OVER (ORDER BY DATE_T)
- ROW_NUMBER ()
OVER (PARTITION BY VALUE1, VALUE2 ORDER BY DATE_T)
seq
FROM boards b)
GROUP BY VALUE1, VALUE2, seq
ORDER BY ID
| ID | VALUE1 | VALUE2 | DATE |
|----|--------|--------|------|
| 1 | A | Z | 2014 |
| 3 | B | Z | 2015 |
| 4 | B | C | 2015 |
| 5 | A | Z | 2016 |
查询1:
CREATE TABLE boards
(ID int, VALUE1 varchar2(1), VALUE2 varchar2(1), DATE_t int)
;
INSERT ALL
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (1, 'A', 'Z', 2014)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (2, 'A', 'Z', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (3, 'B', 'Z', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (4, 'B', 'C', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (5, 'A', 'Z', 2016)
SELECT * FROM dual
;
SELECT MIN (ID) AS ID,
VALUE1,
VALUE2,
MIN (DATE_T) as "DATE"
FROM (SELECT b.*,
ROW_NUMBER () OVER (ORDER BY DATE_T)
- ROW_NUMBER ()
OVER (PARTITION BY VALUE1, VALUE2 ORDER BY DATE_T)
seq
FROM boards b)
GROUP BY VALUE1, VALUE2, seq
ORDER BY ID
| ID | VALUE1 | VALUE2 | DATE |
|----|--------|--------|------|
| 1 | A | Z | 2014 |
| 3 | B | Z | 2015 |
| 4 | B | C | 2015 |
| 5 | A | Z | 2016 |
:
CREATE TABLE boards
(ID int, VALUE1 varchar2(1), VALUE2 varchar2(1), DATE_t int)
;
INSERT ALL
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (1, 'A', 'Z', 2014)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (2, 'A', 'Z', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (3, 'B', 'Z', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (4, 'B', 'C', 2015)
INTO boards (ID, VALUE1, VALUE2, DATE_t)
VALUES (5, 'A', 'Z', 2016)
SELECT * FROM dual
;
SELECT MIN (ID) AS ID,
VALUE1,
VALUE2,
MIN (DATE_T) as "DATE"
FROM (SELECT b.*,
ROW_NUMBER () OVER (ORDER BY DATE_T)
- ROW_NUMBER ()
OVER (PARTITION BY VALUE1, VALUE2 ORDER BY DATE_T)
seq
FROM boards b)
GROUP BY VALUE1, VALUE2, seq
ORDER BY ID
| ID | VALUE1 | VALUE2 | DATE |
|----|--------|--------|------|
| 1 | A | Z | 2014 |
| 3 | B | Z | 2015 |
| 4 | B | C | 2015 |
| 5 | A | Z | 2016 |
我看不到查询,也不清楚预期或当前结果集来自何处。请将您的查询和逻辑添加到问题中。我编辑了这篇文章,希望它更清楚。它仍然不清楚,因为仅将
ROW\u NUMBER
添加到select语句中不应该改变返回的行数。您是否有忘记包含的隐藏的WHERE
子句?我又做了一次。:)现在呢?您当前的输出是正确的,为什么两条A-Z记录中只有一条被删除的逻辑仍然不清楚。谢谢!非常感谢。@ArvydasGadišauskas:请阅读:我想我会将MIN(id)
更改为MIN(id)keep(按日期排列第一顺序)
,特别是如果id最低的行与组中日期最低的行不对应。@KaushikNayak这样做了