SQL: УСТАНОВИТЬ основную запись на основе объединения всех объединений
У меня есть две распространяющиеся базы данных, к которым я присоединяюсь. Эти две базы данных могут иметь одинаковые номера социального страхования. Я пытаюсь установить первичную запись для каждой из этих нескольких записей. Первичная запись должна быть самой ранней датой Orig_Hire и Active = 'A'
database_1.demographics
Ss_No Orig_Hire Active
111-00-1111 2015-01-01 A
111-00-1111 2014-01-01 T
111-00-1111 2015-08-07 A
database_2.demographics
Ss_No Orig_Hire Active
111-00-1111 2013-01-01 T
111-00-1111 2012-01-01 T
Вот мой запрос:
SELECT demo.*,
(select (some logic) from demo WHERE GROUP BY Ss_No) As Primary_Record //this doesnt work
FROM
(SELECT Ss_No, Orig_Hire, Active FROM database_1.demographics
UNION ALL
SELECT Ss_No, Orig_Hire, Active FROM database_2.demographics) demo
Есть ли другой, лучший способ сделать это?
Спасибо
2 ответа
Вам нужно сделать это в двух частях.
Сначала найдите значение min, а затем получите запись, соответствующую этому min.
Позвольте упростить ваш вопрос, называя ваш союз demo
SELECT Ss_No, Orig_Hire, Active FROM database_1.demographics
UNION ALL
SELECT Ss_No, Orig_Hire, Active FROM database_2.demographics
Так что ваша логика, чтобы найти MIN
дата для каждого SSN
было бы
SELECT Ss_No, MIN(Orig_Hire) as Orig_Hire
FROM demo
WHERE Active = 'A'
GROUP BY Ss_No
Теперь вам нужно найти полную запись.
SELECT demo.*
FROM demo
LEFT JOIN (
SELECT Ss_No, MIN(Orig_Hire) as Orig_Hire
FROM demo
WHERE Active = 'A'
GROUP BY Ss_No
) min_hire
ON demo.Orig_Hire = min_hire.Orig_Hire
AND demo.Ss_No = min_hire.Ss_No
В случае, если нет
MIN(Orig_Hire)
сActive = 'A'
вы получите немногоSs_no
с нулевыми значениями, и вы должны проверить их.Также это предполагает, что Ss_No не имеет несколько строк для одного и того же
MIN(Orig_Hire) and Active = 'A'
Я решил это с помощью PHP. Это самый простой способ, который я придумал.
$sql = "SELECT Ss_No, Orig_Hire, Active FROM database_1.demographics
UNION ALL
SELECT Ss_No, Orig_Hire, Active FROM database_2.demographics
ORDER BY 1,3,2 ASC"; /* ORDERBY is important since we are setting the first record*/
$sth = $apex->prepare($sql);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);
$SSN = '';
foreach ($sth as $row) {
if($row['SSN'] != $SSN) {
$row['IsPrimaryAssignment'] = 1;
} else {
$row['IsPrimaryAssignment'] = 0;
}
$SSN = $row['SSN'];
}