powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Помогите, пжл, с запросом
16 сообщений из 16, страница 1 из 1
Помогите, пжл, с запросом
    #38036686
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица (dt STRING, cl INTEGER)
Поле dt хранит дату в формате ISO.

Можно ли составить запрос, который выведет таблицу с полями dt, cl, MaxClPrevMonth, MaxClPrev90dt, DateOfMaxClPrevMonth,DateOfMaxClPrev90dt
MaxClPrevMonth - Максимальное значение Cl предыдущего перед dt месяца, а DateOfMaxClPrevMonth последнее (по возрастанию) значение dt (если их несколько), соответствующее максимальному Cl
MaxClPrev90dt - Максимальное значение Cl из предыдущих(по возрастанию dt) 90 записей, DateOfMaxClPrev90dt аналогично DateOfMaxClPrevMonth

Спасибо!
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38036736
meneo...
Можно ли составить запрос
...

Составить запрос можно.


meneo...
Спасибо!
...Не за что. :)
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38036763
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:)
а с самим запросом можно помочь? )
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38036805
можно, но для этого нужны тестовые данные в удобоваримом виде и желаемый вид результата на этих тестовых данных, потому как словесная формулировка задачи не совсем прозрачная и понятна.
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38036919
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

В приложенном файле пример таблицы.

одна из строк запроса будет выглядеть таким образом

dt - 01.11.2012
cl - 144.3
MaxClPrevMonth - 160.9 - максимальное значение за предыдущий для dt=01.11.2012 месяц (с 01.10.2012 по 31.10.2012)
DateOfMaxClPrevMonth - 01.10.2012 самая поздняя дата в этом интервале, когда это значение было достигнуто
MaxClPrev90dt - 169.52 - максимальное значение за период c (dt-90дней=03.08.2012) по (01.11.2012)
DateOfMaxClPrev90dt - 14.09.2012 самая поздняя дата в этом интервале, когда это значение было достигнуто

соответственно для следующего значения dt - 02.11.2012
MaxClPrevMonth и DateOfMaxClPrevMonth буду теми же
а MaxClPrev90dt и DateOfMaxClPrev90dt вычисляются для интервала (dt-90дней=04.08.2012) по (02.11.2012)

и так далее
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38036930
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*одна из строк результата запроса
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38037310
< Решение на коррелированных скалярных limit-подзапросах во фразе SELECT
Код: sql
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.
select dt, cl,
       (
         select cl 
           from t t1
          where date(t1.dt) between date(t0.dt,'start of month','-1 days','start of month')
                                and date(t0.dt,'start of month','-1 days')
          order by cl desc, dt desc
          limit 1
       ) as MaxClPrevMonth,
       (
         select cl 
           from t t1
          where date(t1.dt) between date(t0.dt,'-90 day') and date(t0.dt)
          order by cl desc, dt desc
          limit 1
       ) as MaxClPrev90dt,
       (
         select dt 
           from t t1
          where date(t1.dt) between date(t0.dt,'start of month','-1 days','start of month')
                                and date(t0.dt,'start of month','-1 days')
          order by cl desc, dt desc
          limit 1
       ) as DateOfMaxClPrevMonth,
       (
         select dt 
           from t t1
          where date(t1.dt) between date(t0.dt,'-90 day') and date(t0.dt)
          order by cl desc, dt desc
          limit 1
       ) as DateOfMaxClPrev90dt
  from t t0



где t - имя твоей таблицы...
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38037312
Можно "похулиганить" и "достать" нужные данные по периоду "90 дней" за один заход, а не за два, как это сделано сейчас.
Вычисление же данных за предыдущий месяц можно вообще вынести в агрегатное встроенное представление и записать его во фразе FROM/JOIN. по идеи, это должно положительно повлиять на производительность запроса.
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38037327
< Похулиганил немного...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select dt, cl,
       substr(y,12) as MaxClPrevMonth,
       substr(y,1,10) as DateOfMaxClPrevMonth,
       substr(x,12) as MaxClPrev90dt,
       substr(x,1,10) as DateOfMaxClPrev90dt
  from (
         select dt, cl,
                (
                  select dt||'~'||cl
                    from t t1
                   where date(t1.dt) between date(t0.dt,'start of month','-1 days','start of month')
                                         and date(t0.dt,'start of month','-1 days')
                   order by cl desc, dt desc
                   limit 1
                ) as y,
                (
                  select dt||'~'||cl
                    from t t1
                   where date(t1.dt) between date(t0.dt,'-90 day') and date(t0.dt)
                   order by cl desc, dt desc
                   limit 1
                ) as x
           from t t0
       ) v;


Но есть ещё куда сокращать кол-во бесполезно сделанной работы... :)
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38038170
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

круто!
Спасибо, сейчас буду разбираться!
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38038290
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

ОЧЕНЬ КРУТО!!!! :)
Спасибо!

Подскажи, пжл, можно ли с помощью функции date получить начало предыдущего квартала?

Спасибо!
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38038432
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
обнаружил ошибку, которую не понимаю как пофиксить :(

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t0.dt, t0.cl
(SELECT t1.dt||'~'||t1.cl FROM t t1
  WHERE t1.dt BETWEEN DATE(t0.dt,'start of month','-1 days','start of month') AND DATE(t0.dt,'start of month','-1 days')
ORDER BY t1.dt DESC 
LIMIT 1) as PrevMonthLastClose
FROM t t0
WHERE t0.dt>="2011-01-01 00:00:00.000" AND t0.dt<="2012-11-14 00:00:00.000"



поле dt хранит дату в строковом формате YYYY-MM-DD HH:MM:SS.SSS
а функция DATE возвращает YYYY-MM-DD

В результате BETWEEN с бОльшим значением работает не как "<=" а как "<"

Есть простой выход исправить "WHERE t1.dt BETWEEN" на "WHERE DATE(t1.dt) BETWEEN". Но у меня таких SELECTов как вычисление PrevMonthClose в запросе 8 штук и при такой правке запрос выполняется раза в 3-5 дольше :(

Можете ли подсказать другое решение проблемы?
Данке!
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38038618
meneoобнаружил ошибку, которую не понимаю как пофиксить :(

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t0.dt, t0.cl
(SELECT t1.dt||'~'||t1.cl FROM t t1
  WHERE t1.dt >= DATE(t0.dt,'start of month','-1 days','start of month') AND  t1.dt <  DATE(t0.dt,'start of month')
ORDER BY t1.dt DESC 
LIMIT 1) as PrevMonthLastClose
FROM t t0
WHERE t0.dt>="2011-01-01 00:00:00.000" AND t0.dt<="2012-11-14 00:00:00.000"



поле dt хранит дату в строковом формате YYYY-MM-DD HH:MM:SS.SSS
а функция DATE возвращает YYYY-MM-DD

В результате BETWEEN с бОльшим значением работает не как "<=" а как "<"

Есть простой выход исправить "WHERE t1.dt BETWEEN" на "WHERE DATE(t1.dt) BETWEEN". Но у меня таких SELECTов как вычисление PrevMonthClose в запросе 8 штук и при такой правке запрос выполняется раза в 3-5 дольше :(

Можете ли подсказать другое решение проблемы?
Данке!

Замени BETWEEN на неравенство...
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38038787
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

спасибо!
И как я сам не додумался )))

Еще разок - данке!
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38040712
meneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Подскажи, пжл, можно ли с помощью функции date получить начало предыдущего квартала?
...
Рейтинг: 0 / 0
Помогите, пжл, с запросом
    #38040818
Стандартного механизма по работе с квартальными порциями даты нет. Попробовал придумать свой велосипед. Вроде получилось, но как-то кривовато :( :
<
Код: sql
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.
select dt,
       date(dt, 'start of month',
              -((strftime('%m', date(dt))-1)%3 + 3)||' Months',
              'start of month'
           ) as prev_qrtl
  from ( -- Тестовые данные:
         select '2012-01-01' as dt union all
         select '2012-01-31' as dt union all
         select '2012-02-01' as dt union all
         select '2012-02-29' as dt union all
         select '2012-03-01' as dt union all
         select '2012-03-31' as dt union all
         select '2012-04-01' as dt union all
         select '2012-04-30' as dt union all
         select '2012-05-01' as dt union all
         select '2012-05-31' as dt union all
         select '2012-06-01' as dt union all
         select '2012-06-30' as dt union all
         select '2012-07-01' as dt union all
         select '2012-07-31' as dt union all
         select '2012-08-01' as dt union all
         select '2012-08-31' as dt union all
         select '2012-09-01' as dt union all
         select '2012-09-30' as dt union all
         select '2012-10-01' as dt union all
         select '2012-10-31' as dt union all
         select '2012-11-01' as dt union all
         select '2012-11-30' as dt union all
         select '2012-12-01' as dt union all
         select '2012-12-31' as dt
       ) t;

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


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