LINUX.ORG.RU

sql запрос

 ,


0

1

Есть таблица sql, поля:
order_user_id, order_id, order_date, order_diff_date

order_diff_date - 0.
пример

1 1 1.01.2013 0
1 1 3.01.2013 0
1 1 4.01.2013 0
2 1 1.01.2013 0
2 1 6.01.2013 0
Нужно посчитать order_diff_date как разницу между предыдущею датою заказу и текущею для кожного пользователя. Если предыдущих значений нет, то поставить 0 К примеру должно стать:
1 1 1.01.2013 0
1 1 3.01.2013 2
1 1 4.01.2013 1
2 1 1.01.2013 0
2 1 6.01.2013 5

★★★★

Нужно на любом скриптовом языке сделать упорядоченную выборку и выполнить update в цикле.

Sorcerer ★★★★★
()

Название таблицы пусть будет t1, тогда для диалекта postgresql:

UPDATE t1 AS «t3» SET order_diff_date = (SELECT COALESCE( order_date - (SELECT t2.order_date FROM t1 AS «t2» WHERE t2.order_date < t1.order_date AND t2.order_user_id = t1.order_user_id ORDER BY t2.order_date DESC LIMIT 1), 0 ) FROM t1 WHERE t3.order_date = t1.order_date);

Если убрать coalesce вместо нулей будут NULL'ы

grondek
()
Ответ на: комментарий от grondek

По-моему, у Вас несколько недочетов:
1. t2.order_date < t1.order_date заменить на (t2.order_date < t1.order_date OR (t2.order_date = t1.order_date AND t2.order_id < t1.order_id))
2. ORDER BY t2.order_date DESC заменить на ORDER BY t2.order_date DESC, t2.order_id DESC
3. t3.order_date = t1.order_date заменить на t3.order_user_id = t1.order_user_id AND t3.order_id = t1.order_id

Но вообще в постгресе ведь есть аналитические функции, поэтому логичнее использовать функцию lag() вместо второго select'а.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

Хм... ну да. На скорую руку не подумал, что в один день может быть несколько покупок. Ага.

Но это если order_id увеличивается для каждой новой записи. Из примера ТСа этого не видно.

grondek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.