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'];
}
Другие вопросы по тегам