Можно ли выбрать 10 строк для каждой группы по дате (отметка времени) в таблице MySQL?Как действовать? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть таблица с атрибутами, такими как отметка времени, SensorName, температура, влажность.Что я делаю, так это получаю результаты, заказывая их тогда по метке времени в заказе DESC, и у меня есть условие, чтобы получить его либо за 1 день 7 дней, либо за предыдущий месяц.Но проблема в том, что я получаю гораздо больше значений при доступе к старым записям.Что мне нужно сделать, так как мои данные упорядочены по отметке времени, мне нужно максимум 15-20 строк / записей для каждой даты. Предположим, я получаю данные с 10 по 17 июня, и у каждой даты есть 100 записей.Мне нужно только 10/20 записей для определенного дня (топ-20 за каждый день).

Моя версия MySQL 5.7.26, и я попытался использовать ROW_NUMBER, но это не помогает

SELECT datestamp AS TIME,Temperature AS TEMPERATURE FROM table_name WHERE NodeAdd = 'SensorName' and datestamp >= DATE_ADD(CURRENT_DATE,INTERVAL -'$somevar' DAY) ORDER BY datestamp DESC

Приведенный выше код показывает, как я получаю данные за разные дни. Переменная $ somevar жестко запрограммирована. Если пользователь выбирает день, то это -1, если он выбирает предыдущую неделю, то это -7 и -30 для предыдущего месяца. Мне нужномаксимум 20 строк / записей для каждого дня.

ПРИМЕЧАНИЕ :: У меня нет таблицы идентификаторов или уникального / первичного ключа в моей таблице, поэтому я пытался получить определенные строки, используя разбиение только по датам,

1 Ответ

0 голосов
/ 17 июня 2019

Вам нужно создать номер строки для группы, которая является датой, и затем вести записи только со строкой номер строки <10, так как вам нужно 10 записей на группу. Следующий скрипт является всего лишь руководством, и вы можете подогнать его под структуру таблицы, чтобы получить желаемый результат- </p>

SELECT * FROM
(
    SELECT *,
    ( 
        CASE DateColumn 
            WHEN @DateColumn THEN @curRow := @curRow + 1 
            ELSE @curRow := 1 AND @DateColumn := DateColumn 
        END
    ) AS rank
    FROM
    (
        SELECT *,CAST(<your_date_column> AS DATE) AS `DateColumn` 
        FROM Your_table
    )A
    ,(SELECT @curRow := 0, @DateColumn := '') r
    ORDER BY <your_date_column>
)A WHERE Rank < 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...