Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите составить запрос / 15 сообщений из 15, страница 1 из 1
24.07.2006, 10:00
    #33872921
dv14
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
база postgresql-8.1.4.
Есть таблица вида
Код: plaintext
1.
2.
3.
4.
5.
create table cust {
  id bigint;
  d date;
  profit double precision;
};
Она представляет выручку(profit) продавца с номером id в день d;
Нужно выбрать строки соответствующие продажам на следующий торговый день после того как выручка была больше 100.

т.е. на наборе
(1, '2006-06-01',10);
(1, '2006-06-02',110);
(1, '2006-06-05',10);
(2, '2006-06-01',110);
(2, '2006-06-02',10);
(2, '2006-06-05',10);

запрос должен выбрать
(1, '2006-06-05',10);
(2, '2006-06-02',10);

У меня проблема в том что даты не являются непрерывными, т.е. продавец мог не работать некоторое время.
...
Рейтинг: 0 / 0
24.07.2006, 10:16
    #33872955
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Тебя интересует только один следующий день для каждого продавца?

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
24.07.2006, 10:21
    #33872969
dv14
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
меня интересует каждый следующий день после того как выручка была больше определенного предела, для каждого продавца.

т.е. на наборе
(1, '2006-06-01',10);
(1, '2006-06-02',110);
(1, '2006-06-05',10);
(1, '2006-06-06',110);
(1, '2006-06-07',10);
(2, '2006-06-01',110);
(2, '2006-06-02',10);
(2, '2006-06-05',10);

запрос должен выбрать
(1, '2006-06-05',10);
(1, '2006-06-07',10);
(2, '2006-06-02',10);

и еще одно замечание - продавцов очень много (около миллиона).
...
Рейтинг: 0 / 0
24.07.2006, 10:24
    #33872976
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Можно сделать и одним запросом, но на таких объемах это будет очень медленное решение...

Надо???


-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
24.07.2006, 10:27
    #33872986
dv14
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Владимор КоневМожно сделать и одним запросом, но на таких объемах это будет очень медленное решение...

Надо???


мне не обязательно одним запросом. подойдет любое решение в том числе и с промежуточными таблицами и с функциями. но конечно хочется, чтобы было как можно быстрее.
...
Рейтинг: 0 / 0
24.07.2006, 10:40
    #33873024
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Ещё нюанс, а если три дня подряд продавец продавал на сумму, удовлетворяющую критерию поиска, то в этом случае какие строки должны вернуться?

Ксли есть вот такой набор данных:
id d profit1 '2006-06-01'1101 '2006-06-02'1101 '2006-06-05'1101 '2006-06-06'101 '2006-06-07'102 '2006-06-01'1102 '2006-06-02'102 '2006-06-05'10
то что мы должны получить на нем для продавца с ID = 1?

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
24.07.2006, 10:44
    #33873033
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Владимор КоневМожно сделать и одним запросом, но на таких объемах это будет очень медленное решение...

Надо???


-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питересли я правильно понимаю, этобудет джойн сам на себя по условию ~
продавец= продавец И день = день(выручка>=100)+1

Почему такой джойн будет медленен? Нужен индекс по продавцу и выручке - для фильтрации по условию, плюс индекс по продавцу и дню - для джойна. Нет?
...
Рейтинг: 0 / 0
24.07.2006, 10:51
    #33873048
dv14
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Владимор КоневЕщё нюанс, а если три дня подряд продавец продавал на сумму, удовлетворяющую критерию поиска, то в этом случае какие строки должны вернуться?

Ксли есть вот такой набор данных:
id d profit1 '2006-06-01'1101 '2006-06-02'1101 '2006-06-05'1101 '2006-06-06'101 '2006-06-07'102 '2006-06-01'1102 '2006-06-02'102 '2006-06-05'10
то что мы должны получить на нем для продавца с ID = 1?


второй и третий день тоже должны войти в результат.
т.е результат должен быть
id d profit1 '2006-06-02'1101 '2006-06-05'1101 '2006-06-06'102 '2006-06-02'10
...
Рейтинг: 0 / 0
24.07.2006, 10:54
    #33873062
dv14
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
4321если я правильно понимаю, этобудет джойн сам на себя по условию ~
продавец= продавец И день = день(выручка>=100)+1
[/quot]

Здесь кстати операция date+1 не подойдет. нужна именно следующая запись из таблицы для данного продавца.
...
Рейтинг: 0 / 0
24.07.2006, 11:04
    #33873098
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
dv14 4321если я правильно понимаю, этобудет джойн сам на себя по условию ~
продавец= продавец И день = день(выручка>=100)+1


Здесь кстати операция date+1 не подойдет. нужна именно следующая запись из таблицы для данного продавца.[/quot]ну, это другое делооо!

я опирался на
автор интересует каждый следующий день
понятие следующий день определно либо на мн-ве дней, либо на некоем его подмножестве. Т.к. подмножество в вормулировке не фигурировало - я позволил допустить, что имеется в виду date+1.

Засим видимо следует открыть набор всех дней, когда выручка 100 и в цикле возвращать что то из
SELECT ... WHERE продавец = $продавец AND date > $date LIMIT 1;
это не будет очень быстрым, но видимо наиболее быстрым из возможного.
...
Рейтинг: 0 / 0
24.07.2006, 11:08
    #33873108
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
4321я опирался на
автор интересует каждый следующий день
понятие следующий день определно либо на мн-ве дней, либо на некоем его подмножестве. Т.к. подмножество в вормулировке не фигурировало - я позволил допустить, что имеется в виду date+1.

dv14У меня проблема в том что даты не являются непрерывными, т.е. продавец мог не работать некоторое время.
...
Рейтинг: 0 / 0
24.07.2006, 11:22
    #33873157
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Владимор Коневъ dv14У меня проблема в том что даты не являются непрерывными, т.е. продавец мог не работать некоторое время.ок. правда нигде не сказано, что если он не работал - то день, когда он начал работать - считается следующим.

А так - да, вы скорее всего более точно протелепатили.
...
Рейтинг: 0 / 0
24.07.2006, 12:09
    #33873358
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
За основу взял вот такой набор данных:
id d profit1 '2006-06-01'1101 '2006-06-02'1101 '2006-06-05'1101 '2006-06-06'101 '2006-06-07'102 '2006-06-01'1102 '2006-06-02'102 '2006-06-05'10

Вот запрос, который вернет нужный набор:
Код: 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.
42.
43.
44.
45.
select v_t_1.id     as "ID продавца",
       v_t_1.d      as "Дата Х",
       v_t_1.profit as "Сумма на дату Х",
       v_t_2.d      as "Дата, следующая за датой Х",
       v_t_2.profit as "Сумма на дату, следующую за Х"
  from (
         select id,
                d,
                profit,
                (
                   select count( 1 ) 
                     from t t1 
                    where t.id = t1.id 
                      and t1.d <= t.d
                ) cnt
           from t
       ) v_t_1
 left outer join -- При необходимости заменить на INNER JOIN
       (
         select id,
                d,
                profit,
                (
                   select count( 1 ) 
                     from t t1 
                    where t.id = t1.id 
                      and t1.d <= t.d
                ) cnt
           from t
       ) v_t_2
    on v_t_1.id = v_t_2.id
   and v_t_1.cnt +  1  = v_t_2.cnt
 where v_t_1.profit >=  100 
 order by v_t_1.id, v_t_1.d

Query finished, retrieving results...

ID продавца     Дата Х     Сумма на дату Х   Дата, следующая за датой Х   Сумма на дату, следующую за Х
-----------   ----------   ---------------   --------------------------   -----------------------------
           1     1 -июн- 2006                 110     2 -июн- 2006                                               110 
           1     2 -июн- 2006                 110     5 -июн- 2006                                               110 
           1     5 -июн- 2006                 110     6 -июн- 2006                                               110 
           1     6 -июн- 2006                 110     7 -июн- 2006                                                10 
           2     1 -июн- 2006                 110     2 -июн- 2006                                                10 

 5  row(s) retrieved


-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
24.07.2006, 13:49
    #33873818
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Владимор КоневЗа основу взял вот такой набор данных:
id d profit1 '2006-06-01'1101 '2006-06-02'1101 '2006-06-05'1101 '2006-06-06' 10 1 '2006-06-07'102 '2006-06-01'1102 '2006-06-02'102 '2006-06-05'10Пардон, немного соврал.
Набор данных был вот такой:
id d profit1 '2006-06-01'1101 '2006-06-02'1101 '2006-06-05'1101 '2006-06-06' 110 1 '2006-06-07'102 '2006-06-01'1102 '2006-06-02'102 '2006-06-05'10
В остальном всё верно :)
...
Рейтинг: 0 / 0
25.07.2006, 05:09
    #33875341
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите составить запрос
Кстати, есть ещё один вариант - с коррелированным подзапросом в SELECT-листе. Возможно он будет менее накладным для сервера. Надо?

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


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