ГРУППА ПО И ЗАКАЗ - PullRequest
       32

ГРУППА ПО И ЗАКАЗ

0 голосов
/ 23 апреля 2019

У меня очень простая Maria DB для целей домашней автоматизации. Это основной экстракт моего ER:

enter image description here

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

Это дает мне набор результатов, который выглядит следующим образом enter image description here

Я бы хотел уточнить свой запрос, чтобы он возвращал только самые последние (по времени) уникальные комбинации для полей TelldusUnits.Name + TelldusActionValueTypes.Name: enter image description here

Я считаю, что мне нужно 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

Я получаю следующий набор результатов: enter image description here

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

enter image description here

Есть еще деталь, о которой нужно позаботиться (в соответствии с моим первоначальным вопросом: я только хотел, чтобы запрос возвращал абсолютно последние (по времени) уникальные комбинации для полей TelldusUnits.Name + TelldusActionValueTypes.Name.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Вы правы, если вы хотите самое позднее время, вам нужно добавить предложение GROUP BY, не учитывая TelldusActionsPerformed.PerformedTime.Пожалуйста, попробуйте этот скрипт

SELECT
    --TelldusActionsPerformed.PerformedTime AS TelldusActionsPerformed_PerformedTime,
    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
0 голосов
/ 24 апреля 2019

рабочий ответ

Мне действительно помог ответ Мурильоса, хотя он не полностью ответил на мой вопрос (я все еще считаю, что это хороший ответ). Это вопрос, который я наконец-то использовал и (надеюсь) отвечает на мой оригинальный вопрос:

SELECT 
    OrderedResultSet.TelldusActionsPerformed_PerformedTime,
    OrderedResultSet.TelldusUnits_Name,
    OrderedResultSet.TelldusActionValues_ActionValue,
    OrderedResultSet.TelldusActionValueTypes_Name

FROM (
    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
) as OrderedResultSet

GROUP BY OrderedResultSet.TelldusUnits_Name, OrderedResultSet.TelldusActionValueTypes_Name

Это дает мне лучшие результаты (последнее время): enter image description here

...