Mam dwie tabele w SQL i muszę być w stanie wykonać sprzężenie w oparciu o znacznik czasu w tabeli B, który jest wcześniejszy lub równy znacznikowi czasowemu w tabeli A.Zapytanie SQL do połączenia dwóch tabel na podstawie najbliżej datownika
Więc, oto niektóre fałszywe dane dla dwóch tabel i sygnał wyjściowy:
zamkniętych spraw (tabela a)
| id | resolution | timestamp | ------------------------------------------------ | 1 | solved | 2006-10-05 11:55:44.888153 | | 2 | closed | 2007-10-07 12:34:17.033498 | | 3 | trashed | 2008-10-09 08:19:36.983747 | | 4 | solved | 2010-10-13 04:28:14.348753 |
Klasyfikacja (tabela B)
| id | value | timestamp | ------------------------------------------------- | 1 | freshman | 2006-01-01 12:02:44.888153 | | 2 | sophomore | 2007-01-01 12:01:19.984333 | | 3 | junior | 2008-01-01 12:02:28.746149 |
Pożądane Wyniki
| id | resolution | timestamp | value | -------------------------------------------------------------- | 1 | solved | 2006-10-05 11:55:44.888153 | freshman | | 2 | closed | 2007-10-07 12:34:17.033498 | sophomore | | 3 | trashed | 2008-10-09 08:19:36.983747 | junior | | 4 | solved | 2010-10-13 04:28:14.348753 | junior |
Tak, wiem, że kod musi wyglądać jak poniżej, po prostu nie może dowiedzieć się, co zrobić z częścią ON
z JOIN
($ 1 i $ 2 to zmienne, które zostaną przekazane w):
SELECT case.id, case.resolution, case.timestamp, class.value
FROM closed_cases AS case
LEFT JOIN classifications AS class ON ???
WHERE case.timestamp BETWEEN $1 AND $2;
wiem, że mógłbym użyć sub-select, ale to będzie działać na w le kilka tysięcy wierszy, prawdopodobnie więcej i potrzebuję, aby było naprawdę szybko; więc liczyłem na prostą klauzulę, która mogłaby to zrobić.
myślę musisz sub-select. Czy przetestowałeś wydajność i okazało się, że jest nie do przyjęcia? – Beth
jeśli wersja SQL, z której korzystasz obsługuje funkcje analityczne okienkowania, powinieneś być w stanie to zrobić bez sub-select, ale niektóre wersje SQL nie obsługują ich. W przypadku pojedynczego sub-select w kilku tysiącach wierszy wydajność nie powinna być zbyt zła. (Sub-select znajdzie się w tabeli klasyfikacji - czy będzie to naprawdę więcej niż kilka tysięcy wierszy?) –
@Mark - Właściwie, pomyśl o tym, tabela klasyfikacji powinna mieć mniej wierszy niż to, co ja. sprawdzać, czy dane rzeczywiście zmieniły się z najbardziej aktualnej wersji.Sądzę więc, że sub-select działałby dobrze, ale myślę, że dodanie czasu końca jest zdecydowanie czystszym rozwiązaniem. –