Как выбрать последнюю запись за сегодня + данные за последние 6 дней - PullRequest
0 голосов
/ 25 сентября 2019

Как выбрать самую последнюю последнюю запись за сегодня + данные за последние 6 дней для конца дня только один раз в день

Есть много строк для одного и того же дня с разными таймингами.

Следует выбрать только 7 строк данных.

+----+-----------------------+
| C1 |   C2                  |
+----+-----------------------+
|  1 |   2019-09-19 00:01:02 |
|  2 |   2019-09-19 00:05:02 |
|  3 |   2019-09-19 23:59:02 |
|  4 |   2019-09-20 00:15:02 |
|  5 |   2019-09-21 00:15:02 |
|  6 |   2019-09-22 00:15:02 |
|  7 |   2019-09-23 00:15:02 |
|  8 |   2019-09-24 00:15:02 |
|  9 |   2019-09-25 00:10:02 |
| 10 |   2019-09-25 00:12:02 |
+----+-----------------------+

Ответы [ 4 ]

2 голосов
/ 25 сентября 2019

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

SELECT d1.*
FROM data d1
JOIN (SELECT DATE(C2) AS Day, MAX(C2) AS C2
      FROM data
      GROUP BY Day
      ORDER BY Day DESC
      LIMIT 7) d2 ON d2.C2 = d1.C2
ORDER BY Date(d1.C2)

Вывод (для чуть большей выборки, чтобыпродемонстрировать только 7 результатов)

C1  C2
3   2019-09-19 23:59:02
4   2019-09-20 00:15:02
5   2019-09-21 00:15:02
6   2019-09-22 00:15:02
7   2019-09-23 00:15:02
8   2019-09-24 00:15:02
10  2019-09-25 00:12:02

Демонстрация на dbfiddle

1 голос
/ 25 сентября 2019

Мы можем справиться с этим, используя ROW_NUMBER, если вы используете MySQL 8 +:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY DATE(C2) ORDER BY C2 DESC) rn
    FROM yourTable
    WHERE C2 >= CURDATE() - INTERVAL 6 DAY
)

SELECT C1, C2
FROM cte
WHERE rn = 1;

enter image description here

Demo

0 голосов
/ 25 сентября 2019

Один из способов сделать это:

select t.*
from t
where t.c2 = (select min(t2.c2)
              from t t2
              where t2.c2 >= date(t.c1) and
                    t2.c2 < date(t.c1) + interval 1 day
             )
order by date desc
limit 7
0 голосов
/ 25 сентября 2019

Я бы использовал GROUP BY для выбора для каждого дня, поэтому:

SELECT *
FROM data
WHERE C2 IN (
     SELECT max(C2)
     FROM data
     WHERE C2 > curdate() - interval 3 day
     GROUP BY date(C2)
     )
ORDER BY C2

Мне всегда нравится использовать «необработанные» значения столбцов в критериях запроса (например, «WHERE C2»), так какэто легко позволяет базе данных использовать индексы там, где она решает, что ей нужно.

Fiddle at: https://www.db -fiddle.com / f / Bh2EU5bcQvmJfyCZqExmS / 1

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