ГРУППИРОВАТЬ ПО ПОРЯДКУ

#sql #group-by #mariadb #sql-order-by

#sql #группировать по #mariadb #sql-порядок-по

Вопрос:

У меня есть очень простая 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:

Следующее обновление, касающееся commnt мистера Мурильо, дало мне лучшую сортировку:

 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 полей.

Ответ №1:

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

 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
  

Комментарии:

1. Спасибо за вашу помощь. Я получаю странное (?) поведение с ORDER BY предложением. Похоже, это не учитывается?

2. О, конечно, я забыл добавить MAX в конце… ПОРЯДОК По МАКСИМУМУ(telldusactionsисполнен. Выполняется время) DESC, это должно сработать, приветствия

Ответ №2:

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

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

 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
  

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