Даны две таблицы:
Таблица A
, содержащая customerid
, lastchange
, internallink
Таблица B
, содержащий internallink
, turnover
(Я просто нахожу здесь и заменяю его на общий пример, фактическая структура более сложна. Сейчас диалект SQLэто mySQL.)
Единственная уникальная вещь (для каждой таблицы) - это internallink.В A есть несколько записей с одним и тем же customerID, разными датами в lastchange и разными значениями internallink.Есть другие предметы, связанные с этим;Я не могу изменить таблицы.
Мне нужны идентификаторы записи из A, которые являются самыми последними для клиента (наибольшее значение lastchange из всех с тем же идентификатором customer) и , для которыхзаписи в B, которые соответствуют определенному условию значения, связаны между собой.
Я думаю, что часть
SELECT `internallink` FROM `B` WHERE (`turnover` > 10000)
не является проблемой.
Я получил это далеко:
SELECT `customerID`, MAX(`lastchange`)
FROM `A`
WHERE `lastchange` IN (SELECT `internallink` FROM `B`
WHERE `turnover` > 10000)
GROUP BY `customerID`;
Увы, это утверждение дает неправильные результаты, потому что выше вернет мне customerIDs, для которых самое последнее значение не соответствует критериям, но некоторые более старые сделали - он выбирает самое старое, которое имело, и возвращает это,Но в случае, если самая последняя запись ниже порогового значения, customerID вообще не должен появляться.
Где я ошибся и каков правильный подход к этому?
Пример таблицы данныхA
customerid lastchange internallink
3 2010-02-11 11
3 2010-09-04 12
3 2010-10-22 13
3 2010-11-23 14
4 2010-05-05 15
4 2010-12-01 16
5 2010-11-28 17
5 2010-11-29 18
Таблица B
internallink turnover
11 47000
12 11000
13 8000
14 15000
15 17000
16 23000
17 50000
18 10000
Фактический порог в моих тестах - 12000. Вы можете видеть, что customerID не должен быть в наборе результатов, так как самая последняя запись находится нижепорог.
Результирующий набор должен быть (3,2010-11-23) (4,2010-12-01) - но в настоящее время он также содержит (5,2010-11-28), что неверно.
Становясь немного ближе (с вашей помощью, спасибо!), Оба эти утверждения работают вместе:
SELECT customerID, MAX (lastchange), internallink FROM A GROUP BY customerID;SELECT internallink FROM B WHERE (оборот> 12000);
Теперь все, что мне нужно, это пересечение обоих ... с правильной логикой!