powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите составить запрос
15 сообщений из 15, страница 1 из 1
помогите составить запрос
    #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
помогите составить запрос
    #33872955
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебя интересует только один следующий день для каждого продавца?

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
помогите составить запрос
    #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
помогите составить запрос
    #33872976
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать и одним запросом, но на таких объемах это будет очень медленное решение...

Надо???


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

Надо???


мне не обязательно одним запросом. подойдет любое решение в том числе и с промежуточными таблицами и с функциями. но конечно хочется, чтобы было как можно быстрее.
...
Рейтинг: 0 / 0
помогите составить запрос
    #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
помогите составить запрос
    #33873033
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор КоневМожно сделать и одним запросом, но на таких объемах это будет очень медленное решение...

Надо???


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

Почему такой джойн будет медленен? Нужен индекс по продавцу и выручке - для фильтрации по условию, плюс индекс по продавцу и дню - для джойна. Нет?
...
Рейтинг: 0 / 0
помогите составить запрос
    #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
помогите составить запрос
    #33873062
dv14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321если я правильно понимаю, этобудет джойн сам на себя по условию ~
продавец= продавец И день = день(выручка>=100)+1
[/quot]

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


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

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

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

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

А так - да, вы скорее всего более точно протелепатили.
...
Рейтинг: 0 / 0
помогите составить запрос
    #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
помогите составить запрос
    #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
помогите составить запрос
    #33875341
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, есть ещё один вариант - с коррелированным подзапросом в SELECT-листе. Возможно он будет менее накладным для сервера. Надо?

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


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