У меня есть таблица адресов с указанием месторасположения основной и дополнительной компании, например:
ID CompanyName AdressType MainID Location
1 ExampleCompany H 0 Germany
2 ExampleCompany N 1 Sweden
3 ExampleCompany N 1 Germany
и у нас есть еще одна таблица контактов, включающая последние контакты для каждого из местоположений компании.
ID SuperID Datecreate Notes
1 1 10.04.2018 XY
2 3 09.04.2018 YX
3 2 11.04.2018 XX
Теперь мы хотим выбрать последнее контактное лицо для каждой компании и отсортировать их, чтобы получить список всех наших клиентов, с которыми мы не контактировали долгое время.
я думал примерно так:
SELECT
ADDRH.ID,
ADDRH.COMPANY1,
TOPCONT.ID,
TOPCONT.DATECREATE,
TOPCONT.NOTES0
FROM dbo.ADDRESSES ADDRH
OUTER APPLY (SELECT TOP 1 ID, SUPERID, DATECREATE, CREATEDBY, NOTES0 FROM DBO.CONTACTS CONT WHERE ADDRH.ID = CONT.SUPERID ORDER BY DATECREATE DESC) TOPCONT
WHERE
TOPCONT.ID IS NOT NULL
ORDER BY TOPCONT.DATECREATE
Но при этом все еще не учитывается тот факт, что одна и та же компания несколько раз была указана в таблице адресов. как я могу создать список, чтобы у каждой компании был последний контакт?
Спасибо за вашу помощь
Привет
Что ж, вам также придется удалить дубликаты с адреса. Из-за структуры ваших данных я думаю, что лучше всего использовать row_number()
:
SELECT ac.*
FROM (SELECT a.ID, a.COMPANY1, c.ID, c.DATECREATE, c.NOTES0,
ROW_NUMBER() OVER (PARTITION BY a.COMPANY1 ORDER BY c.DATECREATE DESC) as seqnum
FROM dbo.ADDRESSES a JOIN
DBO.CONTACTS c
ON a.ID = c.SUPERID
WHERE c.ID IS NOT NULL
) ac
WHERE seqnum = 1
ORDER BY c.DATECREATE;