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这样做了