Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка полседних 2 дат / 10 сообщений из 10, страница 1 из 1
01.10.2019, 17:48
    #39870153
Frequency
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
Есть таблица с данными ;

ID DATES

1 5/1/2015
2 7/31/2016
2 8/30/2017
2 9/20/2018
3 7/5/2019
3 5/9/2014
3 5/10/2013
3 6/11/2013

Как можно по короче сделать выборку , чтобы выборка возвращало последние 2 даты , например :

ID DATES

1 5/1/2015
2 8/30/2017
2 9/20/2018
3 7/5/2019
3 5/9/2014
...
Рейтинг: 0 / 0
01.10.2019, 17:49
    #39870154
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
row_number() or dense_rank()
...
Рейтинг: 0 / 0
01.10.2019, 17:55
    #39870161
Frequency
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
AmKadrow_number() or dense_rank()


Код: plsql
1.
2.
3.
SELECT * FROM (
SELECT DENSE_RANK () OVER (PARTITION BY ID ORDER BY DATES DESC) IDS, M.* FROM MEDICAL.DATES M) M
WHERE M.IDS IN (1,2);




Спасибо , додумался
...
Рейтинг: 0 / 0
01.10.2019, 19:35
    #39870229
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
Если покороче текст - то додумались.
Если побыстрее на приличном объеме - то почитайте http://orasql.org/2013/07/05/topn-2/
...
Рейтинг: 0 / 0
01.10.2019, 19:55
    #39870237
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
andrey_anonymousЕсли побыстрее на приличном объеме

Было-бы неплохо если-бы кто-нибудь протестировал match_recognize. Что-то типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT  *
  FROM  EMP
  MATCH_RECOGNIZE(
                  PARTITION BY DEPTNO
                  ORDER BY HIREDATE DESC
                  ALL ROWS PER MATCH
                  PATTERN(X{2}) -- {limiting count}
                  DEFINE X AS MATCH_NUMBER() = 1
                 )
/

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

6 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
01.10.2019, 20:44
    #39870250
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
SYЧто-то типа
Ну у меня получается что-то типа FTS+"Match Recognize Sort Deterministic finite automation", хотя можно добиться IFS+"Match Recognize Buffer Deterministic finite automation".
Ценник соответствующий.
...
Рейтинг: 0 / 0
01.10.2019, 21:51
    #39870265
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
andrey_anonymousЦенник соответствующий.

Похоже MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON включает в себя что-то типа STOPKEY на основе MATCH_NUMBER() = 1:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
SQL> create or replace
  2  function f1(p_num number)
  3  return number
  4  deterministic
  5  is
  6  begin
  7  dbms_output.put_line(p_num);
  8  return p_num;
  9  end;
 10  /

Function created.

SQL> create table emp1 as select * from emp
SQL> /

Table created.

SQL> alter table emp1 add x number generated always as (f1(empno));

Table altered.

SQL> set serveroutput on
SQL> SELECT  *
  2    FROM  EMP1
  3    MATCH_RECOGNIZE(
  4                    PARTITION BY DEPTNO
  5                    ORDER BY HIREDATE DESC
  6                    ALL ROWS PER MATCH
  7                    PATTERN(X{2}) -- {limiting count}
  8                    DEFINE X AS MATCH_NUMBER() = 1 AND X / CASE WHEN EMPNO IN (7934,7839,7876,7788,7900,7654) THEN 1 ELSE 0 END != 0
  9                   )
 10  /

    DEPTNO HIREDATE       EMPNO ENAME      JOB              MGR        SAL       COMM          X
---------- --------- ---------- ---------- --------- ---------- ---------- ---------- ----------
        10 23-JAN-82       7934 MILLER     CLERK           7782       1300                  7934
        10 17-NOV-81       7839 KING       PRESIDENT                  5000                  7839
        20 23-MAY-87       7876 ADAMS      CLERK           7788       1100                  7876
        20 19-APR-87       7788 SCOTT      ANALYST         7566       3000                  7788
        30 03-DEC-81       7900 JAMES      CLERK           7698        950                  7900
        30 28-SEP-81       7654 MARTIN     SALESMAN        7698       1250       1400       7654

6 rows selected.

7934
7839
7934
7839
7876
7788
7900
7654
SQL> 



SY.
...
Рейтинг: 0 / 0
01.10.2019, 22:30
    #39870285
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
andrey_anonymousхотя можно добиться IFS+"Match Recognize Buffer Deterministic finite automation".

В плане да, но при выполнении:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
SQL> SELECT  BANNER FROM V$VERSION
  2  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> create index emp1_idx1 on emp1(deptno,hiredate desc);

Index created.

SQL> explain plan for
  2  SELECT  /*+ INDEX(EMP1_IDX1) */ DEPTNO,HIREDATE
  3    FROM  EMP1
  4    MATCH_RECOGNIZE(
  5                    PARTITION BY DEPTNO
  6                    ORDER BY HIREDATE DESC
  7                    ALL ROWS PER MATCH
  8                    PATTERN(X{2}) -- {limiting count}
  9                    DEFINE X AS MATCH_NUMBER() = 1
 10                   )
 11  /

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------
Plan hash value: 76931291

------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                            | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                     |           |    14 |   308 |     2  (50)| 00:00:01 |
|   1 |  VIEW                                                |           |    14 |   308 |     2  (50)| 00:00:01 |
|   2 |   MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON|           |    14 |   154 |     2  (50)| 00:00:01 |
|   3 |    INDEX FULL SCAN                                   | EMP1_IDX1 |    14 |   154 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------

10 rows selected.

SQL> SELECT  /*+ INDEX(EMP1_IDX1) */ DEPTNO,HIREDATE
  2    FROM  EMP1
  3    MATCH_RECOGNIZE(
  4                    PARTITION BY DEPTNO
  5                    ORDER BY HIREDATE DESC
  6                    ALL ROWS PER MATCH
  7                    PATTERN(X{2}) -- {limiting count}
  8                    DEFINE X AS MATCH_NUMBER() = 1
  9                   )
 10  /
SELECT  /*+ INDEX(EMP1_IDX1) */ DEPTNO,HIREDATE
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel


SQL> 



На 18C/19C не пробовал.

SY.
...
Рейтинг: 0 / 0
02.10.2019, 04:20
    #39870327
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
SYПохоже MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON включает в себя что-то типа STOPKEY на основе MATCH_NUMBER() = 1

Так наглядней:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> SELECT  *
  2    FROM  EMP1
  3    MATCH_RECOGNIZE(
  4  --                  PARTITION BY DEPTNO
  5                    ORDER BY HIREDATE DESC
  6                    ALL ROWS PER MATCH
  7                    PATTERN(X{2}) -- {limiting count}
  8                    DEFINE X AS MATCH_NUMBER() / (3 - MATCH_NUMBER()) = .5
  9                   )
 10  /

HIREDATE       EMPNO ENAME      JOB              MGR        SAL       COMM     DEPTNO
--------- ---------- ---------- --------- ---------- ---------- ---------- ----------
23-MAY-87       7876 ADAMS      CLERK           7788       1100                    20
19-APR-87       7788 SCOTT      ANALYST         7566       3000                    20

SQL> 



SY.
...
Рейтинг: 0 / 0
02.10.2019, 13:28
    #39870522
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полседних 2 дат
SYandrey_anonymousЦенник соответствующий.

Похоже MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON включает в себя что-то типа STOPKEY на основе MATCH_NUMBER() = 1:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
SQL> create table dropme_t(part_key not null, ord not null, payload) as select mod(rownum,1e2), rownum, rpad(rownum,50,'x') from dual connect by level < 1e6;

Table created.

Elapsed: 00:00:02.79
SQL> create index dropme_t$i1 on dropme_t(part_key,ord);

Index created.

Elapsed: 00:00:03.60
SQL>
SQL> set autotrace traceonly explain statistics
SQL>
SQL> SELECT     *
  2    FROM     dropme_t
  3    MATCH_RECOGNIZE(
  4                    PARTITION BY part_key
  5                    ORDER BY ord DESC
  6                    ALL ROWS PER MATCH
  7                    PATTERN(X{2}) -- {limiting count}
  8                    DEFINE X AS MATCH_NUMBER() = 1
  9                   )
 10  ;

200 rows selected.

Elapsed: 00:00:01.04

Execution Plan
----------------------------------------------------------
Plan hash value: 65543279

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation                                            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                     |          |   999K|    50M| 10193   (1)| 00:00:01 |
|   1 |  VIEW                                                |          |   999K|    50M| 10193   (1)| 00:00:01 |
|   2 |   MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON|          |   999K|    56M| 10193   (1)| 00:00:01 |
|   3 |    TABLE ACCESS FULL                                 | DROPME_T |   999K|    56M|  1292   (1)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          2  recursive calls
         10  db block gets
       4418  consistent gets
          0  physical reads
          0  redo size
      14083  bytes sent via SQL*Net to client
        511  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
        200  rows processed

SQL>
SQL> SELECT     part_key, ord
  2    FROM     dropme_t
  3    MATCH_RECOGNIZE(
  4                    PARTITION BY part_key
  5                    ORDER BY ord DESC
  6                    ALL ROWS PER MATCH
  7                    PATTERN(X{2}) -- {limiting count}
  8                    DEFINE X AS MATCH_NUMBER() = 1
  9                   )
 10  ;

200 rows selected.

Elapsed: 00:00:01.78

Execution Plan
----------------------------------------------------------
Plan hash value: 14499672

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                            | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                     |             |   999K|    24M|  2673   (3)| 00:00:01 |
|   1 |  VIEW                                                |             |   999K|    24M|  2673   (3)| 00:00:01 |
|   2 |   MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON|             |   999K|  7812K|  2673   (3)| 00:00:01 |
|   3 |    INDEX FAST FULL SCAN                              | DROPME_T$I1 |   999K|  7812K|   383   (2)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          2  recursive calls
          0  db block gets
       1322  consistent gets
       1308  physical reads
          0  redo size
       3826  bytes sent via SQL*Net to client
        511  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
        200  rows processed

SQL>
SQL> with t0_unique( part_key) as (
  2                select min(t1.part_key)
  3                from dropme_t t1
  4                union all
  5                select (select min(t1.part_key) next_key from dropme_t t1 where t1.part_key>t.part_key) next_key
  6                from t0_unique t
  7                where t.part_key is not null
  8  ), t_unique as (select * from t0_unique union all select null from dual where 1=0)
  9  select *
 10   from t_unique t, lateral(select * from (select * from dropme_t tt where tt.part_key = t.part_key order by part_key desc, ord desc) where rownum <=2)
 11  ;

200 rows selected.

Elapsed: 00:00:00.02

Execution Plan
----------------------------------------------------------
Plan hash value: 19967763

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                                    | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                             |                 |     6 |   396 |    24   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                                |                 |     6 |   396 |    24   (0)| 00:00:01 |
|   2 |   VIEW                                       |                 |     3 |    39 |     9   (0)| 00:00:01 |
|   3 |    UNION-ALL                                 |                 |       |       |            |          |
|   4 |     VIEW                                     |                 |     2 |    26 |     9   (0)| 00:00:01 |
|   5 |      UNION ALL (RECURSIVE WITH) BREADTH FIRST|                 |       |       |            |          |
|   6 |       SORT AGGREGATE                         |                 |     1 |     3 |            |          |
|   7 |        INDEX FULL SCAN (MIN/MAX)             | DROPME_T$I1     |     1 |     3 |     3   (0)| 00:00:01 |
|   8 |       SORT AGGREGATE                         |                 |     1 |     3 |            |          |
|   9 |        FIRST ROW                             |                 |     1 |     3 |     3   (0)| 00:00:01 |
|* 10 |         INDEX RANGE SCAN (MIN/MAX)           | DROPME_T$I1     |     1 |     3 |     3   (0)| 00:00:01 |
|* 11 |       RECURSIVE WITH PUMP                    |                 |       |       |            |          |
|* 12 |     FILTER                                   |                 |       |       |            |          |
|  13 |      FAST DUAL                               |                 |     1 |       |     2   (0)| 00:00:01 |
|  14 |   VIEW                                       | VW_LAT_5E5D704D |     2 |   106 |     5   (0)| 00:00:01 |
|* 15 |    COUNT STOPKEY                             |                 |       |       |            |          |
|  16 |     VIEW                                     |                 |     2 |   106 |     5   (0)| 00:00:01 |
|  17 |      TABLE ACCESS BY INDEX ROWID             | DROPME_T        | 10000 |   576K|     5   (0)| 00:00:01 |
|* 18 |       INDEX RANGE SCAN DESCENDING            | DROPME_T$I1     |     2 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  10 - access("T1"."PART_KEY">:B1)
  11 - filter("T"."PART_KEY" IS NOT NULL)
  12 - filter(NULL IS NOT NULL)
  15 - filter(ROWNUM<=2)
  18 - access("TT"."PART_KEY"="T"."PART_KEY")


Statistics
----------------------------------------------------------
          7  recursive calls
          0  db block gets
        725  consistent gets
          0  physical reads
          0  redo size
      14442  bytes sent via SQL*Net to client
        511  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
        102  sorts (memory)
          0  sorts (disk)
        200  rows processed

SQL>
SQL>

...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка полседних 2 дат / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]