Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросиком (аналитическая функция???) / 25 сообщений из 59, страница 1 из 3
03.11.2018, 15:08
    #39727584
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Постановка задачи:
Имеем табличку
Код: 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 (
    SELECT   1 id, 1 idx, TO_DATE('01.01.2000 00:00:00', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   2 id, 6 idx, TO_DATE('01.01.2000 00:00:01', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   3 id, 7 idx, TO_DATE('01.01.2000 00:00:02', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   4 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   5 id, 8 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   6 id, 7 idx, TO_DATE('01.01.2000 00:00:05', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   7 id, 7 idx, TO_DATE('01.01.2000 00:00:06', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL

    SELECT   8 id, 0 idx, TO_DATE('01.01.2000 00:00:07', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL

    SELECT   9 id, 1 idx, TO_DATE('01.01.2000 00:00:08', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL

    SELECT  10 id, 0 idx, TO_DATE('01.01.2000 00:00:09', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL

    SELECT  11 id, 1 idx, TO_DATE('01.01.2000 00:00:10', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  12 id, 2 idx, TO_DATE('01.01.2000 00:00:11', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  13 id, 5 idx, TO_DATE('01.01.2000 00:00:12', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  14 id, 6 idx, TO_DATE('01.01.2000 00:00:13', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  15 id, 6 idx, TO_DATE('01.01.2000 00:00:14', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  16 id, 7 idx, TO_DATE('01.01.2000 00:00:15', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  17 id, 7 idx, TO_DATE('01.01.2000 00:00:16', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL
)


Нужно построить запрос, который возвращает id всех строки таблички, за исключением "повторов", т.е. для "повторов" только первую строку вернуть нужно.
И запрос должен быть вида:
Код: 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.
WITH t AS ( SELECT   1 id, 1 idx, TO_DATE('01.01.2000 00:00:00', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   2 id, 6 idx, TO_DATE('01.01.2000 00:00:01', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   3 id, 7 idx, TO_DATE('01.01.2000 00:00:02', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   4 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   5 id, 8 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   6 id, 7 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   7 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
        
            SELECT   8 id, 0 idx, TO_DATE('01.01.2000 00:00:07', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
        
            SELECT   9 id, 1 idx, TO_DATE('01.01.2000 00:00:08', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
        
            SELECT  10 id, 0 idx, TO_DATE('01.01.2000 00:00:09', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
        
            SELECT  11 id, 1 idx, TO_DATE('01.01.2000 00:00:10', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  12 id, 2 idx, TO_DATE('01.01.2000 00:00:11', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  13 id, 5 idx, TO_DATE('01.01.2000 00:00:12', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  14 id, 6 idx, TO_DATE('01.01.2000 00:00:13', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  15 id, 6 idx, TO_DATE('01.01.2000 00:00:14', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  16 id, 7 idx, TO_DATE('01.01.2000 00:00:15', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  17 id, 7 idx, TO_DATE('01.01.2000 00:00:16', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL
)
SELECT  id
FROM   (SELECT  id
            ,   (CASE WHEN <Условие>
                      THEN 1
                      ELSE 0
                 END) cond
        FROM    t
        )
WHERE  cond = 1


т.е. <Условие> нужно прописать.

Уточнения:
"Первая" - это та, у которой d наименьшее, при равных d - c минимальным id (id уникальны).
"Повторами" считаются записи внутри календарных суток с одинаковым idx , однако, если встретилась строка с FLAG =1, то "забываем" про повтор.

Поясню на примере для idx=7:
строку с id=4 нужно вывести в отчет, а строки с id in (4,6,7) - нет, это "повторы".
Кроме того, строку с id=16 тоже нужно вывести в отчет, т.к. между строками 4 и 16 имеются строки с FLAD=1 (id=8, 10).
Строку 17 снова не выводим - это "повтор" 16.

Сам пробовал через
Код: plsql
1.
COUNT(1) OVER(PARTITION BY TRUNC(d), idx ORDER BY d ASC, id) = 1


т.е. для строки смотрим - по группе с таким же idx берем только первую, однако мозг сломал, как мне FLAG=1 тут учесть...

По идее, нужно группы еще разбить по моменту появления FLAG=1, но что-то не врублюсь как.

Помогите, пожалуйста, если не сложно.

PS структура данных и запрос - не мои, приходится "вписываться"
...
Рейтинг: 0 / 0
03.11.2018, 15:18
    #39727587
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuHесли встретилась строка с FLAG =1, то "забываем" про повтор.STFF start_of_group. Например
Код: plsql
1.
sum(flag) over (partition by trunc(d), idx order by d asc, id) as group_no


KOT MATPOCKuHСам пробовал через
Код: plsql
1.
COUNT(1) OVER(PARTITION BY TRUNC(d), idx ORDER BY d ASC, id)

Код: plsql
1.
row_number() over (partition by trunc(d), idx, group_no order by d asc, id)
...
Рейтинг: 0 / 0
03.11.2018, 15:26
    #39727588
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Elic,
не отразил, как это "засунуть" в запрос вместо "Условие" ?
Ведь так же не напишешь
Код: plsql
1.
row_number() over (partition by trunc(d), idx, sum(flag) over (partition by trunc(d), idx order by d asc, id) order by d asc, id)=1
...
Рейтинг: 0 / 0
03.11.2018, 15:32
    #39727590
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuHкак это "засунуть" в запрос вместо "Условие" ?Никак. Нужны inline view.
...
Рейтинг: 0 / 0
03.11.2018, 15:32
    #39727591
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
idx бывают 0 .. 255
может это как-то поможет?
...
Рейтинг: 0 / 0
03.11.2018, 15:39
    #39727592
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuHможет это как-то поможет?Спроси у астрологов.
...
Рейтинг: 0 / 0
03.11.2018, 16:15
    #39727600
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Elic,

Логично, фигню спросил )))

FLAG=0 обычно с idx=0
...
Рейтинг: 0 / 0
03.11.2018, 16:18
    #39727601
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
т.е. если бы в группу по idx можно было кроме записей с idx=idx еще и добавить с idx=0 ...
...
Рейтинг: 0 / 0
03.11.2018, 17:25
    #39727625
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuHPS структура данных и запрос - не мои, приходится "вписываться"Subquery с вытекающей гибкостью, но тормознутостью.
...
Рейтинг: 0 / 0
03.11.2018, 22:33
    #39727705
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuH,

Код: 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.
with t as (
    SELECT   1 id, 1 idx, TO_DATE('01.01.2000 00:00:00', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   2 id, 6 idx, TO_DATE('01.01.2000 00:00:01', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   3 id, 7 idx, TO_DATE('01.01.2000 00:00:06', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   4 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   5 id, 8 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   6 id, 7 idx, TO_DATE('01.01.2000 00:00:05', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   7 id, 7 idx, TO_DATE('01.01.2000 00:00:02', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT   8 id, 0 idx, TO_DATE('01.01.2000 00:00:07', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
    SELECT   9 id, 1 idx, TO_DATE('01.01.2000 00:00:08', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  10 id, 0 idx, TO_DATE('01.01.2000 00:00:09', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
    SELECT  11 id, 1 idx, TO_DATE('01.01.2000 00:00:10', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  12 id, 2 idx, TO_DATE('01.01.2000 00:00:11', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  13 id, 5 idx, TO_DATE('01.01.2000 00:00:12', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  14 id, 6 idx, TO_DATE('01.01.2000 00:00:13', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  15 id, 6 idx, TO_DATE('01.01.2000 00:00:14', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  16 id, 7 idx, TO_DATE('01.01.2000 00:00:15', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
    SELECT  17 id, 7 idx, TO_DATE('01.01.2000 00:00:16', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL
),
t_flag_gr as (
                select  t.*,
                        sum(case flag when 1 then 1 else 0 end) over (partition by trunc(d) order by d, id) flag_group_no
                from t
),
t_sog as (
            select t_flag_gr.*,
                   lag(idx) over(partition by trunc(d) order by idx, d, id),
                   case when lag(idx) over (partition by trunc(d) order by idx, d, id) = idx and
                             lag(flag_group_no) over (partition by trunc(d) order by idx, d, id) = flag_group_no
                        then 0 else 1 end sog
            from t_flag_gr
),
t_gr as (
            select  t_sog.*,
                    sum(sog) over (partition by trunc(d) order by idx, d, id) group_no
            from t_sog
)
select *
from t
where id in (select first_value(id) over (partition by trunc(d), idx, group_no order by d , id) from t_gr)
order by d, id
...
Рейтинг: 0 / 0
03.11.2018, 23:36
    #39727711
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Надо было сначала Elic-a почитать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
t_flag_gr as (
                select  t.*,
                        sum(case flag when 1 then 1 else 0 end) over (partition by trunc(d) order by d, id) flag_group_no
                from t
)
select * from (select t_flag_gr.*, row_number() over (partition by trunc(d), idx, flag_group_no order by d asc, id) rn from t_flag_gr)
where rn = 1
order by d, id
...
Рейтинг: 0 / 0
04.11.2018, 08:38
    #39727736
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
SkilledJuniorНадо было сначала Elic-a почитать
Код: plsql
1.
sum(case flag when 1 then 1 else 0 end)

Недочитал.
...
Рейтинг: 0 / 0
04.11.2018, 14:40
    #39727803
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
ElicНедочитал.
Насколько я понял автора топика, триггерная только единица и могут быть значения отличные от 0 и 1.
KOT MATPOCKuHidx бывают 0 .. 255
может это как-то поможет?
...
Рейтинг: 0 / 0
04.11.2018, 14:43
    #39727804
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Пардон невнимательно прочитал
...
Рейтинг: 0 / 0
04.11.2018, 21:01
    #39727902
rushchel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Как решить с помощью start_of_group? У меня только такой вариант вышел.
Код: 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.
with t as ( select   1 id, 1 idx, to_date('01.01.2000 00:00:00', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select   2 id, 6 idx, to_date('01.01.2000 00:00:01', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select   3 id, 7 idx, to_date('01.01.2000 00:00:02', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select   4 id, 7 idx, to_date('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select   5 id, 8 idx, to_date('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select   6 id, 7 idx, to_date('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select   7 id, 7 idx, to_date('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all        
            select   8 id, 0 idx, to_date('01.01.2000 00:00:07', 'dd.mm.yyyy hh24:mi:ss') d, 1 flag from dual union all        
            select   9 id, 1 idx, to_date('01.01.2000 00:00:08', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all        
            select  10 id, 0 idx, to_date('01.01.2000 00:00:09', 'dd.mm.yyyy hh24:mi:ss') d, 1 flag from dual union all        
            select  11 id, 1 idx, to_date('01.01.2000 00:00:10', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select  12 id, 2 idx, to_date('01.01.2000 00:00:11', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select  13 id, 5 idx, to_date('01.01.2000 00:00:12', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select  14 id, 6 idx, to_date('01.01.2000 00:00:13', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select  15 id, 6 idx, to_date('01.01.2000 00:00:14', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select  16 id, 7 idx, to_date('01.01.2000 00:00:15', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual union all
            select  17 id, 7 idx, to_date('01.01.2000 00:00:16', 'dd.mm.yyyy hh24:mi:ss') d, 0 flag from dual
          )
,t2 as (select t.*
              ,row_number() over (partition by trunc(d), idx order by d, id) rn
              ,sum(t.flag) over (partition by trunc(d) order by d, id)       summ
              ,lag(t.id) over (partition by trunc(d), idx order by d, id)    lagid
          from t
       )
,t3 as (select a.*
              ,a.summ - nvl(b.summ, 0) summ2
          from t2 a left join t2 b on a.lagid = b.id       
       )
select id
  from (select id
              ,(case 
                 when 
                   case
                     when rn = 1 then 1 
                     else 
                       case 
                         when flag = 1 then 1
                         else 
                           case 
                             when summ2 > 0 then 1
                             else 0
                          end
                       end
                   end = 1 then 1
                 else 0
               end) as cond
          from t3
        )
 where cond = 1
 order by id

        ID
----------
         1
         2
         3
         5
         8
         9
        10
        11
        12
        13
        14
        16

 12 rows selected
...
Рейтинг: 0 / 0
04.11.2018, 21:16
    #39727908
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
rushchelКак решить с помощью start_of_group? У меня только такой вариант вышел.row_number() нужно считать с учётом групп на основе flag.
...
Рейтинг: 0 / 0
05.11.2018, 11:07
    #39728012
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuH,

Мне в голову только такое пришло, хотя пн. утро - я еще сплю Может что и не дочитал в условии
Код: 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.
WITH t AS ( SELECT   1 id, 1 idx, TO_DATE('01.01.2000 00:00:00', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   2 id, 6 idx, TO_DATE('01.01.2000 00:00:01', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   3 id, 7 idx, TO_DATE('01.01.2000 00:00:02', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   4 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   5 id, 8 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   6 id, 7 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   7 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
        
            SELECT   8 id, 0 idx, TO_DATE('01.01.2000 00:00:07', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
        
            SELECT   9 id, 1 idx, TO_DATE('01.01.2000 00:00:08', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
        
            SELECT  10 id, 0 idx, TO_DATE('01.01.2000 00:00:09', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
        
            SELECT  11 id, 1 idx, TO_DATE('01.01.2000 00:00:10', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  12 id, 2 idx, TO_DATE('01.01.2000 00:00:11', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  13 id, 5 idx, TO_DATE('01.01.2000 00:00:12', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  14 id, 6 idx, TO_DATE('01.01.2000 00:00:13', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  15 id, 6 idx, TO_DATE('01.01.2000 00:00:14', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  16 id, 7 idx, TO_DATE('01.01.2000 00:00:15', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  17 id, 7 idx, TO_DATE('01.01.2000 00:00:16', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL
)
SELECT  id
FROM   (SELECT  id
            ,   (CASE WHEN (min(id) over (partition by idx, trunc(d) order by d, id) = id) or flag = 1
                      THEN 1
                      ELSE 0
                 END) cond
        FROM    t
        )
WHERE  cond = 1
...
Рейтинг: 0 / 0
05.11.2018, 11:26
    #39728015
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
MaximaXXLне дочитал
...
Рейтинг: 0 / 0
05.11.2018, 11:41
    #39728021
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
Почему непременно аналитикой-то?
pattern matching жеж прям-таки просится.
...
Рейтинг: 0 / 0
05.11.2018, 11:53
    #39728028
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
andrey_anonymousПочему непременно аналитикой-то?
pattern matching жеж прям-таки просится.

А ну ка сбацай =)
...
Рейтинг: 0 / 0
05.11.2018, 11:55
    #39728030
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
ElicMaximaXXLне дочитал

Я так и знал, вот выпил кофе и получилось вот такое:
Код: 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.
WITH t AS ( SELECT   1 id, 1 idx, TO_DATE('01.01.2000 00:00:00', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   2 id, 6 idx, TO_DATE('01.01.2000 00:00:01', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   3 id, 7 idx, TO_DATE('01.01.2000 00:00:02', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   4 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   5 id, 8 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   6 id, 7 idx, TO_DATE('01.01.2000 00:00:04', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT   7 id, 7 idx, TO_DATE('01.01.2000 00:00:03', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
        
            SELECT   8 id, 0 idx, TO_DATE('01.01.2000 00:00:07', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
        
            SELECT   9 id, 1 idx, TO_DATE('01.01.2000 00:00:08', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
        
            SELECT  10 id, 0 idx, TO_DATE('01.01.2000 00:00:09', 'dd.mm.yyyy hh24:mi:ss') d, 1 FLAG FROM DUAL UNION ALL
        
            SELECT  11 id, 1 idx, TO_DATE('01.01.2000 00:00:10', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  12 id, 2 idx, TO_DATE('01.01.2000 00:00:11', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  13 id, 5 idx, TO_DATE('01.01.2000 00:00:12', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  14 id, 6 idx, TO_DATE('01.01.2000 00:00:13', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  15 id, 6 idx, TO_DATE('01.01.2000 00:00:14', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  16 id, 7 idx, TO_DATE('01.01.2000 00:00:15', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL UNION ALL
            SELECT  17 id, 7 idx, TO_DATE('01.01.2000 00:00:16', 'dd.mm.yyyy hh24:mi:ss') d, 0 FLAG FROM DUAL
)
, t1 as (select id, idx+sum(flag) over (order by id)*1000 idx, d from t)

SELECT  id
FROM   (SELECT  id
            ,   (CASE WHEN min(id) over (partition by idx, trunc(d) order by d, id) = id
                      THEN 1
                      ELSE 0
                 END) cond
        FROM    t1
        )
WHERE  cond = 1



умножал на 1000, потому что так нагляднее и это при условии что автор утверждает что
KOT MATPOCKuHidx бывают 0 .. 255
может это как-то поможет?
...
Рейтинг: 0 / 0
05.11.2018, 12:07
    #39728033
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
MaximaXXL,

Код: plsql
1.
, t1 as (select id, idx+sum(flag) over (partition by trunc(d) order by d, id)*1000 idx, d from t)



вот это забыл, просто пример был только за 1 дату
...
Рейтинг: 0 / 0
05.11.2018, 12:12
    #39728038
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
MaximaXXL,

Фигня в том, что не могу я в запросе кроме как <Условие> что-то вставлять.
Ограничение на <Условие> только одно: 2к байт.

Если интересно объясню:
1) запрос этот делаю не я, он такой зашит в систему, править не могу.
<Условие> - подставляется динамоэскуэлем из некой таблички - в нее могу вносить записи с нужным критерием.
Собственно это и является самым жестким критерием поставленной здесь задачки

2) Данные - падают из другой системы, это события некого оборудования, которые приходят в БД (исходную) разными путями.
Время - это время поступления их в ту БД, поэтому, в таблице много дублей, которые, по сути, и хочется отсечь.
Объем - в день несколько лямов строк.


Пока я проблему решил простым способом - создал функцию, которую и вызываю в <Условие>. Производительность оставляет желать лучшего...
Однако хотелось бы ...
...
Рейтинг: 0 / 0
05.11.2018, 12:26
    #39728043
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
KOT MATPOCKuH,

А можете создать view и на нее натравить свой запрос? Или это тоже прибито гвоздями?
...
Рейтинг: 0 / 0
05.11.2018, 12:39
    #39728046
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросиком (аналитическая функция???)
"Все уже украдено до нас"
Elic
Код: plsql
1.
sum(flag) over (partition by trunc(d), idx order by d asc, id) as group_no


Код: plsql
1.
row_number() over (partition by trunc(d), idx, group_no order by d asc, id)


Другие варианты получаются из разряда 100 верст не крюк))
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросиком (аналитическая функция???) / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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