В настоящее время я изучаю, как использовать SQL Lite, и хотел бы отсортировать топ-3 самых популярных мест получения по часам.У меня есть миллионы строк данных с интересующими столбцами: lpep_pickup_datetime (время получения) и POLocationID (место получения).
Я бы хотел попасть в топ-3 самых популярных мест получения по часам.
Вот пример данных:
+----------------------+--------------+-----------------+
| lpep_pickup_datetime | PULocationID | passenger_count |
+----------------------+--------------+-----------------+
| 1/1/2017 0:01 | 42 | 1 |
| 1/1/2017 0:03 | 75 | 1 |
| 1/1/2017 0:04 | 82 | 5 |
| 1/1/2017 0:01 | 255 | 1 |
| 1/1/2017 0:00 | 166 | 1 |
| 1/1/2017 0:00 | 179 | 1 |
| 1/1/2017 0:02 | 74 | 1 |
| 1/1/2017 0:15 | 112 | 1 |
| 1/1/2017 0:06 | 36 | 1 |
| 1/1/2017 0:14 | 127 | 5 |
| 1/1/2017 0:01 | 41 | 1 |
| 1/1/2017 0:31 | 97 | 1 |
| 1/1/2017 0:01 | 255 | 5 |
| 1/1/2017 0:00 | 70 | 1 |
| 1/1/2017 0:03 | 255 | 1 |
| 1/1/2017 0:03 | 82 | 1 |
| 1/1/2017 0:00 | 36 | 1 |
| 1/1/2017 0:01 | 7 | 1 |
+----------------------+--------------+-----------------+
Попытка сделать это на SQLLiteStudio 3.2.1 - может, мне просто нужно использовать полный набор MySQL, чтобы иметь возможность использовать нужные функции?
SELECT
PULocationID, count(PULocationID)
FROM GreenCabs2017
GROUP BY PULocationID
ORDER BY count(PULocationID) DESC
LIMIT 3
Запрос, который я пробовал, возвращает только первые 3 местоположения раскладки по всему набору данных, а не по часам дня - как я смогу группировать по часам дня?Другие решения в StackExchange ссылаются на функции date_time и date_format, которые не будут выполняться, когда я пробую их на SQL Lite - какой запрос будет работать на SQL Lite?
В идеале должно быть что-то вроде следующего:
+-------------+--------------+-----------------+
| Time of Day | PULocationID | PULocationCount |
+-------------+--------------+-----------------+
| 0:00 | 74 | 677 |
| 0:00 | 65 | 333 |
| 0:00 | 55 | 220 |
+-------------+--------------+-----------------+
Это будет вывод для 3 лучших мест получения с полуночи до 1:00 утра.Этот временной диапазон должен применяться ко всем датам, то есть от 1/1 до 1/31, а не только к 1/1, как в примере, который я предоставил.
ОБНОВЛЕНИЕ: изменен формат отметок времени на YYYY-ММ-ДД ЧЧ: ММ: СС, так что теперь я могу использовать функции datetime.
Я смог выполнить запрос, который, я думаю, может приблизить меня к тому, что я ищу:
SELECT lpep_pickup_datetime, PULocationID, count(PULocationID)
FROM GreenCabs2017
WHERE STRFTIME('%Y', lpep_pickup_datetime) = '2017' AND
STRFTIME('%H', lpep_pickup_datetime) <= '01' AND
STRFTIME('%H', lpep_pickup_datetime) >= '00'
GROUP BY PULocationID
ORDER BY count(PULocationID) DESC
LIMIT 3
Это дало вывод
+----------------------+--------------+---------------------+
| lpep_pickup_datetime | PULocationID | count(PULocationID) |
+----------------------+--------------+---------------------+
| 1/31/2017 1:13 | 255 | 7845 |
| 1/31/2017 1:04 | 7 | 4596 |
| 1/31/2017 1:07 | 82 | 3892 |
+----------------------+--------------+---------------------+
Но столбец lpep_pickup_datetime по-прежнему указывает, что это будет между 1:00 и 2:00, а не 12:00 и 1:00 утра?Удаление знака "=" в запросе не приводит к получению результатов.И я бы предпочел не делать этого каждый час в день - есть ли способ получить вывод по часам через один запрос?