We rise up for the things we believe in over and over again
По большей части эта запись для себя самого, чтобы банально не забыть правило, которое вывел для себя. А звучит оно просто - всегда два поля, одно аггрегирующее, второе вычисляемое.
Это про вот такую конструкцию:
И как работает.
Есть таблица принтеров, где показано, какой принтер когда и куда был поставлен. В этой таблице можно отследить все перемещения данного конкретного принтера. И из этой же таблицы можно актуальный список установленных на данный момент принтеров. То есть для каждого принтера нужно получить самую свежую строку.
Разбор начинаем с собственно Inner Join. Из таблицы Log выбираем два поля, MAC-адрес (так как именно он является однозначным идентификатором каждого принтера) и дату установки. Группируем выборку по этому самому адресу. Если бы это делалось в Powershell, можно было бы указать примерно так:
... | select MAC,Date | group Date
А на выходе получили бы следующее:
В SQL такое не прокатит, но и не надо. Вот тут-то и пригодится вышеозначенное правило. Аггрегировали мы по полю MAC, а дату - вычислим. В качестве вычисления будет функция, возвращающая максимальное значение из всей полученной выборки.
Ну а после того, как получили рабочий Join, навешиваем на него остальные данные, которые нам выбирает первый Select. В качестве связи между двумя таблицами будет одновременное выполнение двух условий: MAC из первого Select должен быть равен MAC из Join, Дата из первого Select должна быть равна полю Time_Stamp из Join.
Все это в сумме дает по одной строке на каждый MAC, то есть, на каждый принтер. Что и требовалось.
Черт, давно же с базами данных (пусть даже это всего лишь MSахсекс Access) не приходилось работать. Но если все получится - наконец-то избавимся от бардака в информации о всех принтерах, какие только есть.
Это про вот такую конструкцию:
И как работает.
Есть таблица принтеров, где показано, какой принтер когда и куда был поставлен. В этой таблице можно отследить все перемещения данного конкретного принтера. И из этой же таблицы можно актуальный список установленных на данный момент принтеров. То есть для каждого принтера нужно получить самую свежую строку.
Разбор начинаем с собственно Inner Join. Из таблицы Log выбираем два поля, MAC-адрес (так как именно он является однозначным идентификатором каждого принтера) и дату установки. Группируем выборку по этому самому адресу. Если бы это делалось в Powershell, можно было бы указать примерно так:
... | select MAC,Date | group Date
А на выходе получили бы следующее:
В SQL такое не прокатит, но и не надо. Вот тут-то и пригодится вышеозначенное правило. Аггрегировали мы по полю MAC, а дату - вычислим. В качестве вычисления будет функция, возвращающая максимальное значение из всей полученной выборки.
Ну а после того, как получили рабочий Join, навешиваем на него остальные данные, которые нам выбирает первый Select. В качестве связи между двумя таблицами будет одновременное выполнение двух условий: MAC из первого Select должен быть равен MAC из Join, Дата из первого Select должна быть равна полю Time_Stamp из Join.
Все это в сумме дает по одной строке на каждый MAC, то есть, на каждый принтер. Что и требовалось.
Черт, давно же с базами данных (пусть даже это всего лишь MS