powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Можно ли решить средствами только SQL?
9 сообщений из 9, страница 1 из 1
Можно ли решить средствами только SQL?
    #36690903
11gR2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All.

Появилась проблема, которую хотелось бы решить средствами SQL:

Есть таблица из двух полей (дата и значение):
Код: plaintext
1.
2.
3.
CREATE TABLE data (
date   REAL,
value  INTEGER
);
Необходимо для заданного диапазона дат (date >= start AND date <= end)
подсчитать количество (этих количеств м.б. несколько) записей в группах,
у которых поле "date" различается не более чем на один день
и при этом "value", к примеру, больше 10.

Пример:
01.07.2010, 17
02.07.2010, 15
03.07.2010, 1
04.07.2010, 24
05.07.2010, 11
07.07.2010, 15

Подсчитать все последовательности со 2.07.2010 по 7.07.2010 где даты идут подряд и value > 10.
Ответ:
1
2
1

В Oracle можно на PL/SQL что-нибудь придумать, а вот в рамках SQLite я что-то плохо себе представляю, как такое изобразить.

Заранее спасибо.
Всем удачи и интересной работы.
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36690995
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача не совсем понятна, но решается подобное запросто.

OLAP для бедных:
1) Убеждаешься что исходный набор можно отсортировать.
2) Загоняешь исходный набор во временную таблицу которая будет иметь два дополнительных поля: номер записи и флаг записи. Нумеруешь все записи.
3) Проходишь по временной таблице и сравниваешь каждую запись с предыдущей (они же уже пронумерованы). В зависимости от результат сравнения устанавливаешь или снимаешь флаг.
4) Делаешь выборку из времянки на основе флага.
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36691508
2Автор.

В Oracle шаришь? Вот тебе вариант под ANSI-SQL, но с использованием оракловых функций по работе со строками и датами (to_char, ||, date arifmetic):
Как вариант:
Код: plaintext
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
  data as
    (
      select to_date('01.07.2010','dd.mm.yyyy') as date$,  17  as value from dual union all
      select to_date('02.07.2010','dd.mm.yyyy') as date$,  15  as value from dual union all
      select to_date('03.07.2010','dd.mm.yyyy') as date$,   1  as value from dual union all
      select to_date('04.07.2010','dd.mm.yyyy') as date$,  24  as value from dual union all
      select to_date('05.07.2010','dd.mm.yyyy') as date$,  11  as value from dual union all
      select to_date('07.07.2010','dd.mm.yyyy') as date$,  15  as value from dual
    )
--
-- Основной запрос:
select min(to_char(v.date$,'dd.mm.yyyy'))||' - '||
       max(to_char(v.date$,'dd.mm.yyyy')) as date_range,
       count( 1 ) as range_length
  from (
         select d0.date$, d0.value,
                d0.date$ - (
                             select count( 1 )
                               from data d1
                              where d1.date$ between date'2010-07-02' 
                                                 and date'2010-07-07'
                                and d1.value >  10 
                                and d1.date$ <= d0.date$
                           ) as grp_id
           from data d0
          where d0.date$ between date'2010-07-02' 
                             and date'2010-07-07'
            and d0.value >  10 
       ) v
 group by grp_id

Query finished, retrieving results...

       DATE_RANGE         RANGE_LENGTH
-----------------------   ------------
 02 . 07 . 2010  -  02 . 07 . 2010                1 
 04 . 07 . 2010  -  05 . 07 . 2010                2 
 07 . 07 . 2010  -  07 . 07 . 2010                1 

 3  row(s) retrieved
Всё что тебе осталось - заменить оракловые функции по работе с датами и строками на аналоги из диалекта SQLite
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36691990
Добрый Э - Эх2Автор.

В Oracle шаришь? Вот тебе вариант под ANSI-SQL, но с использованием оракловых функций по работе со строками и датами (to_char, ||, date arifmetic):
Как вариант:
Код: plaintext
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
  data as
    (
      select to_date('01.07.2010','dd.mm.yyyy') as date$,  17  as value from dual union all
      select to_date('02.07.2010','dd.mm.yyyy') as date$,  15  as value from dual union all
      select to_date('03.07.2010','dd.mm.yyyy') as date$,   1  as value from dual union all
      select to_date('04.07.2010','dd.mm.yyyy') as date$,  24  as value from dual union all
      select to_date('05.07.2010','dd.mm.yyyy') as date$,  11  as value from dual union all
      select to_date('07.07.2010','dd.mm.yyyy') as date$,  15  as value from dual
    )
--
-- Основной запрос:
select min(to_char(v.date$,'dd.mm.yyyy'))||' - '||
       max(to_char(v.date$,'dd.mm.yyyy')) as date_range,
       count( 1 ) as range_length
  from (
         select d0.date$, d0.value,
                d0.date$ - (
                             select count( 1 )
                               from data d1
                              where d1.date$ between date'2010-07-02' 
                                                 and date'2010-07-07'
                                and d1.value >  10 
                                and d1.date$ <= d0.date$
                           ) as grp_id
           from data d0
          where d0.date$ between date'2010-07-02' 
                             and date'2010-07-07'
            and d0.value >  10 
       ) v
 group by grp_id

Query finished, retrieving results...

       DATE_RANGE         RANGE_LENGTH
-----------------------   ------------
 02 . 07 . 2010  -  02 . 07 . 2010                1 
 04 . 07 . 2010  -  05 . 07 . 2010                2 
 07 . 07 . 2010  -  07 . 07 . 2010                1 

 3  row(s) retrieved
Всё что тебе осталось - заменить оракловые функции по работе с датами и строками на аналоги из диалекта SQLite
Выделенное, конечно же, следует заменить на такое:

Код: plaintext
1.
2.
select to_char(min(v.date$),'dd.mm.yyyy')||' - '||
       to_char(max(v.date$),'dd.mm.yyyy') as date_range,
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36693359
11gR2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Добрый Э - Эх:

Да, это действительно хорошее решение. Очень хорошее.
Было чувство, что как-то можно, но не доходило, как именно. :-)

Спасибо.
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36693368
11gR2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 White Owl:

автор1) Убеждаешься что исходный набор можно отсортировать.
...
Так как данных очень и очень много (миллионы результатов измерений), то временные таблицы - сильно накладно в данном конкретном случае.
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36693402
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, в SQLite WITH появилось ?
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36693452
Dmitry ArefievА что, в SQLite WITH появилось ?Посмотри на ник топикстартера, прочитай внимательно его первый пост. Должно быть понятно, что человек знаком с Oracle.
мой пост предназначался топикстартеру, чтобы в синтаксисе понятной и знакомой ему СУБД показать решения поставленной им задачи.
Собственно, я же специально сделал акцент на том, что запрос - под Oracle, что требуется его "рихтовка" под SQLite.
В моем примере WITH нужен лишь для демонстрации тех данных, на которых работает основной запрос. Основной же запрос использует ANSI-SQL в чистом виде, не считая внутренних оракловых SQL-функций (to_char, ||, и т.д.)
...
Рейтинг: 0 / 0
Можно ли решить средствами только SQL?
    #36693509
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я видел.

Значит нет, жаль ... :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Можно ли решить средствами только SQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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