В качестве упрощенного примера мне нужно выбрать каждый экземпляр, в котором у клиента был адрес доставки, отличный от предыдущего адреса доставки. Таким образом, у меня есть большой стол с колоннами, таких как:SQL: упорядочить, затем выбрать первую строку с отдельным значением для нескольких столбцов
purchase_id | cust_id | date | address | description
-----------------------------------------------------------
1 | 5 | jan | address1 | desc1
2 | 6 | jan | address2 | desc2
3 | 5 | feb | address1 | desc3
4 | 6 | feb | address2 | desc4
5 | 5 | mar | address3 | desc5
6 | 5 | mar | address3 | desc6
7 | 5 | apr | address1 | desc7
8 | 6 | may | address4 | desc8
Обратите внимание, что клиенты могут «двигаться назад» к предыдущему адресу, как клиент сделал 5 в строке 7.
То, что я хочу, чтобы выбрать (и как насколько это возможно, так как это довольно большая таблица) - это первая строка из каждого «блока», в которой заказчик отправил последующие заказы на тот же адрес. В этом примере это будут строки 1,2,5,7 и 8. У всех остальных клиент имеет тот же адрес, что и их предыдущий заказ.
Так эффективно я хочу сначала ORDER BY (cust_id, date)
, затем SELECT purchase_id, cust_id, min(date), address, description
.
Однако у меня возникли проблемы, потому что SQL обычно требует, чтобы GROUP BY
выполнялось до ORDER BY
. Поэтому я не могу понять, как адаптироваться, например, либо из верхних ответов на this question (что мне в общем-то нравится.) Необходимо (по крайней мере, концептуально) упорядочить по дате перед группировкой или использовать агрегатные функции, такие как min()
, иначе я пропустил бы экземпляры, подобные строке 7 в моей таблице примеров, где клиент «вернулся» к предыдущему адресу.
Обратите внимание, что два клиента могут совместно использовать адрес, поэтому мне необходимо эффективно группировать cust_id
и address
после заказа по дате.
Я использую снежинку, который я считаю имеет те же самые команды, доступных в последние версии PostgreSQL и SQL Server (хотя я довольно новый для снежинки поэтому не совсем уверен.)
Вы хотите только вернуть покупки для клиентов более чем один адрес? –
Может быть 1,2,5,8 вместо 1,2,7,8? –
Anthony E: Нет, я хочу вернуть (по крайней мере) 1 строку для всех клиентов, которые когда-либо имели адрес, и больше строк для клиентов, которые меняли адреса один или несколько раз. Giorgi Nakeuri: Спасибо, должно быть 1,2,5,7 и 8. (Строки 5 и 7 имеют другой адрес, чем последний, который использовал клиент.) Отредактирован. – DNB