Как найти последнее увеличение значения в сгруппированной таблице MySQL? - PullRequest
1 голос
/ 02 апреля 2020

Я занимаюсь статистикой коронавируса. Не могли бы вы помочь мне с вопросом, пожалуйста. Я хотел бы получить LAST-инфицированный («подтвержденное» поле) рост для каждой страны. Некоторые страны не обновляют каждый день, поэтому должна быть разница между вторым последним измерением и последним для каждой страны.

Короче говоря - как найти последнее увеличение значения в сгруппированной таблице?

Таблица выглядит так:

CREATE TABLE coronavirus ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, place VARCHAR(30), province VARCHAR(30), country VARCHAR(40), updated TIMESTAMP, confirmed INTEGER, deaths INTEGER, recovered INTEGER, latitude FLOAT, longitude FLOAT);

Спасибо!

PS. Содержимое таблицы выглядит так:

mysql> select * from coronavirus where id>8000 order by id limit 10;
+------+-------+-----------------+-------------+---------------------+-----------+--------+-----------+----------+-----------+
| id   | place | province        | country     | updated             | confirmed | deaths | recovered | latitude | longitude |
+------+-------+-----------------+-------------+---------------------+-----------+--------+-----------+----------+-----------+
| 8001 | NULL  | Shanghai        | China       | 2020-03-23 14:18:01 |       404 |      4 |       329 |   31.202 |   121.449 |
| 8002 | NULL  | Shanxi          | China       | 2020-03-13 08:56:40 |       133 |      0 |       133 |  37.5777 |   112.292 |
| 8003 | NULL  | Sichuan         | China       | 2020-03-22 07:20:38 |       543 |      3 |       536 |  30.6171 |    102.71 |
| 8004 | NULL  | Sint Maarten    | Netherlands | 2020-03-23 23:19:21 |         2 |      0 |         0 |  18.0425 |  -63.0548 |
| 8005 | NULL  | South Australia | Australia   | 2020-03-23 23:23:20 |       134 |      0 |         6 | -34.9285 |   138.601 |
| 8006 | NULL  | St Martin       | France      | 2020-03-23 23:19:21 |         8 |      0 |         0 |  18.0708 |  -63.0501 |
| 8007 | NULL  | Tasmania        | Australia   | 2020-03-23 23:23:20 |        28 |      0 |         3 | -42.8821 |   147.327 |
| 8008 | NULL  | Tianjin         | China       | 2020-03-23 03:57:57 |       141 |      3 |       133 |  39.3054 |   117.323 |
| 8009 | NULL  | Tibet           | China       | 2020-02-23 11:19:02 |         1 |      0 |         1 |  31.6927 |   88.0924 |
| 8010 | NULL  | Victoria        | Australia   | 2020-03-23 23:23:20 |       355 |      0 |        97 | -37.8136 |   144.963 |
+------+-------+-----------------+-------------+---------------------+-----------+--------+-----------+----------+-----------+

mysql> select count(*) from coronavirus;                                                                                                                           +----------+
+----------+
| count(*) |
+----------+
|    34783 |
+----------+

1 Ответ

1 голос
/ 02 апреля 2020

Показывает последнюю запись + увеличение по сравнению с предыдущей записью:

SELECT
    cv.country,
    cv.confirmed,
    (cv.confirmed - (
            SELECT
                confirmed
            FROM
                coronavirus
            WHERE
                country = cv.country
                AND id != cv.id
            ORDER BY
                updated DESC
            LIMIT 1)) AS confirmed_increase
FROM
    coronavirus cv
    INNER JOIN (
        SELECT
            MAX(updated) AS updated,
            country
        FROM
            coronavirus
        GROUP BY
            country) cv2 ON cv2.country = cv.country
    AND cv.updated = cv2.updated
WHERE
    cv.updated = cv2.updated;

Что это делает: поскольку GROUP BY идет до ORDER BY, нам нужно сначала обойти это, поэтому он выбирает все записи и присоединяется к себе, чтобы получить только последние записи для всех стран. Затем он использует подзапрос, чтобы найти последний элемент той же страны, который НЕ имеет тот же идентификатор, что и последняя запись, так что это будет первая запись. Обратите внимание, что если у вас есть другие условия для запроса, их также необходимо добавить в подзапрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...