Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Помогите, пжл, с запросом / 16 сообщений из 16, страница 1 из 1
13.11.2012, 17:13
    #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
13.11.2012, 17:31
    #38036736
Помогите, пжл, с запросом
meneo...
Можно ли составить запрос
...

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


meneo...
Спасибо!
...Не за что. :)
...
Рейтинг: 0 / 0
13.11.2012, 17:40
    #38036763
meneo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пжл, с запросом
:)
а с самим запросом можно помочь? )
...
Рейтинг: 0 / 0
13.11.2012, 17:54
    #38036805
Помогите, пжл, с запросом
можно, но для этого нужны тестовые данные в удобоваримом виде и желаемый вид результата на этих тестовых данных, потому как словесная формулировка задачи не совсем прозрачная и понятна.
...
Рейтинг: 0 / 0
13.11.2012, 19:29
    #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
13.11.2012, 19:36
    #38036930
meneo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пжл, с запросом
*одна из строк результата запроса
...
Рейтинг: 0 / 0
14.11.2012, 06:27
    #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
14.11.2012, 06:40
    #38037312
Помогите, пжл, с запросом
Можно "похулиганить" и "достать" нужные данные по периоду "90 дней" за один заход, а не за два, как это сделано сейчас.
Вычисление же данных за предыдущий месяц можно вообще вынести в агрегатное встроенное представление и записать его во фразе FROM/JOIN. по идеи, это должно положительно повлиять на производительность запроса.
...
Рейтинг: 0 / 0
14.11.2012, 07:15
    #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
14.11.2012, 15:15
    #38038170
meneo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пжл, с запросом
Добрый Э - Эх,

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

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

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

Спасибо!
...
Рейтинг: 0 / 0
14.11.2012, 17:13
    #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
14.11.2012, 18:42
    #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
14.11.2012, 20:59
    #38038787
meneo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пжл, с запросом
Добрый Э - Эх,

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

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

Подскажи, пжл, можно ли с помощью функции date получить начало предыдущего квартала?
...
Рейтинг: 0 / 0
16.11.2012, 06:19
    #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
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Помогите, пжл, с запросом / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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