Выберите распределенный выборочный набор записей из множества записей MySQL - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть таблица, в которой много строк, причем строки встречаются со скоростью 400-500 в минуту (я знаю, что это не так много), но мне нужно провести своего рода анализ трендаданные, которые были собраны за последнюю 1 минуту.

Вместо того, чтобы извлекать все записи, которые были введены, а затем обрабатывать каждую из них, я действительно хотел бы иметь возможность выбрать, скажем, 10 записей - которые происходят в несколько равномерном распределении в течение указанного периода времени..

ID       DEVICE_ID       LA         LO          CREATED         
-------------------------------------------------------------------
1           1           23.4        948.7       2018-12-13 00:00:01
2           2           22.4        948.2       2018-12-13 00:01:01
3           2           28.4        948.3       2018-12-13 00:02:22
4           1           26.4        948.6       2018-12-13 00:02:33
5           1           21.4        948.1       2018-12-13 00:02:42
6           1           22.4        948.3       2018-12-13 00:03:02
7           1           28.4        948.0       2018-12-13 00:03:11
8           2           23.4        948.8       2018-12-13 00:03:12
...                                                             
492         2           21.4        948.4       2018-12-13 00:03:25
493         1           22.4        948.2       2018-12-13 00:04:01
494         1           24.4        948.7       2018-12-13 00:04:02
495         2           27.4        948.1       2018-12-13 00:05:04

Учитывая этот набор данных, вместо того, чтобы извлекать все эти строки, я хотел бы, возможно, извлекать строки из набора каждые 50 записей (10 строк для примерно ~ 500 возвращаемых строк).

Это не обязательно должно быть точно, мне просто нужен образец для выполнения какой-либо линейной регрессии.

Возможно ли это вообще?Я могу сделать это в своем коде приложения, если это необходимо, но я хотел посмотреть, есть ли функция или что-то в MySQL, которая бы справилась с этим.

Редактировать Вот мой запроспопробовал, что работает на данный момент - но я хотел бы, чтобы результаты были более равномерно распределены, а не RAND ().

SELECT * FROM (
SELECT * FROM (
SELECT t.*, DATE_SUB(NOW(), INTERVAL 30 HOUR) as offsetdate

from tracking t
HAVING created > offsetdate) as parp
ORDER BY RAND()
LIMIT 10) as mastr
ORDER BY id ASC;

1 Ответ

0 голосов
/ 14 декабря 2018

Не упорядочивать по RAND () как ранду, рассчитанному для каждой строки, затем переупорядочивать и только тогда вы выбираете несколько записей.

Вы можете попробовать что-то вроде этого:

SELECT
    *
FROM
    (
        SELECT
            tracking.*
            , @rownum := @rownum + 1 AS rownum
        FROM
            tracking
            , (SELECT @rownum := 0) AS dummy
        WHERE
            created > DATE_SUB(NOW(), INTERVAL 30 HOUR)
    ) AS s
WHERE
    (rownum % 10) = 0

Индекс для созданного является «обязательным».

Кроме того, вы можете использовать что-то вроде 'AND (UNIX_TIMESTAMP (созданный)% 60 = 0)', которое немного отличается от того, что вы хотели, однако можетвсе будет в порядке (зависит от вашего дистрибутива вставки)

...