powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросиком (аналитическая функция???)
25 сообщений из 59, страница 1 из 3
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #39727590
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOT MATPOCKuHкак это "засунуть" в запрос вместо "Условие" ?Никак. Нужны inline view.
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727591
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
idx бывают 0 .. 255
может это как-то поможет?
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727592
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOT MATPOCKuHможет это как-то поможет?Спроси у астрологов.
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727600
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

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

FLAG=0 обычно с idx=0
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727601
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. если бы в группу по idx можно было кроме записей с idx=idx еще и добавить с idx=0 ...
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727625
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOT MATPOCKuHPS структура данных и запрос - не мои, приходится "вписываться"Subquery с вытекающей гибкостью, но тормознутостью.
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #39727736
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorНадо было сначала Elic-a почитать
Код: plsql
1.
sum(case flag when 1 then 1 else 0 end)

Недочитал.
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727803
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicНедочитал.
Насколько я понял автора топика, триггерная только единица и могут быть значения отличные от 0 и 1.
KOT MATPOCKuHidx бывают 0 .. 255
может это как-то поможет?
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39727804
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон невнимательно прочитал
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #39727908
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rushchelКак решить с помощью start_of_group? У меня только такой вариант вышел.row_number() нужно считать с учётом групп на основе flag.
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #39728015
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLне дочитал
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39728021
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему непременно аналитикой-то?
pattern matching жеж прям-таки просится.
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #39728028
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousПочему непременно аналитикой-то?
pattern matching жеж прям-таки просится.

А ну ка сбацай =)
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #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
Помогите с запросиком (аналитическая функция???)
    #39728038
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

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

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

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


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

А можете создать view и на нее натравить свой запрос? Или это тоже прибито гвоздями?
...
Рейтинг: 0 / 0
Помогите с запросиком (аналитическая функция???)
    #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
25 сообщений из 59, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросиком (аналитическая функция???)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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