У меня очень простая Maria DB для целей домашней автоматизации. Это основной экстракт моего ER:
TelldusActionsPerformed
- это таблица журнала. Он используется для отслеживания самых разных действий (таких как измерение температуры, закрытие двери, выключатель питания и т. Д.), Выполняемых в разное время.
Я использую следующий запрос для извлечения интересных данных:
SELECT
TelldusActionsPerformed.PerformedTime AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
ORDER BY TelldusActionsPerformed.PerformedTime DESC
Это дает мне набор результатов, который выглядит следующим образом
Я бы хотел уточнить свой запрос, чтобы он возвращал только самые последние (по времени) уникальные комбинации для полей TelldusUnits.Name
+ TelldusActionValueTypes.Name
:
Я считаю, что мне нужно GROUP BY TelldusUnits.Name, TelldusActionValueTypes.Name
, чтобы получить уникальные комбинации? Можно ли ограничить мой результат поиска последними уникальными комбинациями для полей TelldusUnits.Name
+ TelldusActionValueTypes.Name
только с SQL? Как?
Редактировать 1:
Если я запускаю скрипт г-на Мурильо прямо из коробки (я только добавил FROM_UNIXTIME (), я забыл его в своем первоначальном вопросе):
SELECT
FROM_UNIXTIME(MAX(TelldusActionsPerformed.PerformedTime)) AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
GROUP BY TelldusUnits.Name, TelldusActionValues.ActionValue, TelldusActionValueTypes.Name
ORDER BY TelldusActionsPerformed.PerformedTime DESC
Я получаю следующий набор результатов:
ORDER BY TelldusActionsPerformed.PerformedTime DESC
смущает меня. Таблица, похоже, не упорядочена по потомкам согласно PerformedTime
?
(PerformedTime
, UNIX-отметка времени имеет тип данных int (11))
Редактировать 2:
Следующее обновление, касающееся г-на Мурильо, дало мне лучшую сортировку:
SELECT
FROM_UNIXTIME(MAX(TelldusActionsPerformed.PerformedTime)) AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
GROUP BY TelldusUnits.Name, TelldusActionValues.ActionValue, TelldusActionValueTypes.Name
ORDER BY MAX(TelldusActionsPerformed.PerformedTime) DESC
Есть еще деталь, о которой нужно позаботиться (в соответствии с моим первоначальным вопросом: я только хотел, чтобы запрос возвращал абсолютно последние (по времени) уникальные комбинации для полей TelldusUnits.Name
+ TelldusActionValueTypes.Name
.