Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как найти first date после min date? / 8 сообщений из 8, страница 1 из 1
14.08.2019, 17:25
    #39849388
khl91
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Подскажите пожалуйста, как найти следующую дату после минимальной?
Стоит задача найти дату первой и второй покупки в разрезе клиентов. Первую дату понятно как. А как найти следующую???

авторselect
customer_name,
min(pp.datepayment)::date as first_date
???? ::date as second_date
from data.d_allsales as pp
where pp.region in (2,17)
and pp.typepayment=2
group by 1
...
Рейтинг: 0 / 0
14.08.2019, 21:43
    #39849504
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
khl91,

Так как толком не оформлено лень ломать голову на оптимизацию.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with data(id,name) as (
	values
	(1,'1'),
	(2,'1'),
	(3,'1'),
	(4,'1'),
	(1,'2'),
	(2,'2'),
	(3,'2'),
	(4,'2')
	)
select 
  distinct   
  name,
  first_value(id) over(partition by name order by id) as a,
  nth_value(id,2) over(partition by name order by id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING) as b 
from data
...
Рейтинг: 0 / 0
15.08.2019, 10:17
    #39849608
khl91
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Troglodit, спасибо.

Нашла еще такое решение тоже работает:

авторselect customer_name,
max(case when dep_day=1 then ot.datepayment end) as fdep_date,
max(case when dep_day=2 then ot.datepayment end) as sdep_date
FROM
(select
*,
row_number () over (partition by pp.customer_name order by pp.datepayment)as dep_day
from data.d_allsales as pp
where pp.region in (2,17)
and pp.typepayment=2
) as ot
group by customer_name
...
Рейтинг: 0 / 0
15.08.2019, 10:20
    #39849611
khl91
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Troglodit, спасибо.

Нашла еще такое решение тоже работает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select customer_name,
max(case when dep_day=1 then ot.datepayment end) as fdep_date,
max(case when dep_day=2 then ot.datepayment end) as sdep_date
FROM 
(select
*,
row_number () over (partition by pp.customer_name order by pp.datepayment)as dep_day
from data.d_allsales as pp
where pp.region in (2,17)
and pp.typepayment=2
) as ot
group by customer_name
...
Рейтинг: 0 / 0
15.08.2019, 14:48
    #39849808
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Отсортировать результат по возрастанию и пропустить первую строку.
...
Рейтинг: 0 / 0
15.08.2019, 19:56
    #39850020
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Guzya,

О_о
Это как?
...
Рейтинг: 0 / 0
15.08.2019, 20:50
    #39850039
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Был не прав.

В итоге получилось такое
Код: sql
1.
select * from (select id,pokupka, datepayment,  row_number() over(partition by id order by datepayment ) as rw from customer) as foo where rw < 3;



id pokupka datepayment rw 1 1 2018-12-31 1 1 1 2019-01-01 2 2 1 2018-12-31 1 2 1 2019-01-01 2

Из такого

id pokupka datepayment 1 1 2019-01-01 1 1 2018-12-31 1 1 2019-01-31 2 1 2019-01-31 2 1 2018-12-31 2 1 2019-01-01
...
Рейтинг: 0 / 0
15.08.2019, 23:25
    #39850082
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти first date после min date?
Guzya,

Можете считать, что я придираюсь, но у вас не верные выходные данные.
Столбцов с timestamp должно быть 2.
А у вас?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как найти first date после min date? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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