Ниже для BigQuery Standard SQL
#standardSQL
SELECT c.sur, c.fam,
ARRAY_AGG(horoscope ORDER BY h.sur DESC LIMIT 1)[OFFSET(0)] horoscope
FROM `project.dataset.customer` c
JOIN `project.dataset.horoscope` h
ON c.fam = h.fam
AND c.sur = IFNULL(h.sur, c.sur)
GROUP BY c.sur, c.fam
Вы можете проверить, поиграть с выше, используя пример данных из вашего примера, как в примере ниже
#standardSQL
WITH `project.dataset.horoscope` AS (
SELECT 'John' sur,'Doe' fam, 'text1' horoscope UNION ALL
SELECT 'Jane', 'Doe', 'text2' UNION ALL
SELECT NULL, 'Doe', 'text3' UNION ALL
SELECT 'Ike', 'Smith', 'text4' UNION ALL
SELECT NULL, 'Smith', 'text5'
), `project.dataset.customer` AS (
SELECT 'John' sur, 'Doe' fam UNION ALL
SELECT 'Jack', 'Doe' UNION ALL
SELECT 'Lisa', 'Smith' UNION ALL
SELECT 'Carl', 'Smith'
)
SELECT c.sur, c.fam,
ARRAY_AGG(horoscope ORDER BY h.sur DESC LIMIT 1)[OFFSET(0)] horoscope
FROM `project.dataset.customer` c
JOIN `project.dataset.horoscope` h
ON c.fam = h.fam
AND c.sur = IFNULL(h.sur, c.sur)
GROUP BY c.sur, c.fam
с результатом
Row sur fam horoscope
1 John Doe text1
2 Jack Doe text3
3 Lisa Smith text5
4 Carl Smith text5