Я прохожу курс CMU Database Systems с осени 2018 года самостоятельно и смущен тем решением, которое они дали для Домашней работы 1 Вопрос 5: https://15445.courses.cs.cmu.edu/fall2018/homework1/
Может кто-нибудь объяснить решение, начиная с ROUND?Я знаю, что tdate - это CTE, содержащий все даты поездки (2013-08-29 to 2015-08-31)
, и что функция strftime возвращает строку, представляющую секунды с 1970-01-01
Вопрос 5: Найдитеtop 10 дней с самым высоким средним уровнем использования велосипедов.Для простоты мы рассматриваем только поездки, в которых используются велосипеды с id <= 100 </strong>.Среднее использование велосипедов на дату D рассчитывается как сумма длительностей всех поездок, произошедших на дату D, деленная на общее количество велосипедов с id <= 100 </strong>, что является постоянной величиной.Если поездка перекрывается с датой D, но начинается до даты D или заканчивается после даты D, то при расчете среднего использования велосипедов с датой D. будет учитываться только интервал, который перекрывается с date D (from 0:00 to 24:00)
. И мы рассчитываем только среднее использование велосипедов.на дату, которая была либо начальной, либо конечной датой поездки.
Примечание: При расчете продолжительности поездки на велосипеде, пожалуйста, используйте trip.start_time и trip.end_time.Пожалуйста, НЕ используйте trip.duration, поскольку в данных trip.duration есть несоответствие в имеющихся у нас данных.
База данных игрушек может быть создана следующим образом, причем первые 10 кортежей являются частью выходных данных:
CREATE TABLE trip(
id integer not null,
duration integer,
start_time timestamp,
start_station_name text,
start_station_id smallint,
end_time timestamp,
end_station_name text,
end_station_id smallint,
bike_id smallint,
PRIMARY KEY (id),
FOREIGN KEY (start_station_id) REFERENCES station(station_id),
FOREIGN KEY (end_station_id) REFERENCES station(station_id)
);
INSERT INTO trip(id, duration, start_time, start_station_name, start_station_id,
end_time, end_station, end_station_name, end_station_id, bike_id)
VALUES
(360813, 85555, "2014-07-12 10:34:00", "Rengstorff Avenue / California Street", 33, "2014-07-13 10:20:00", "Rengstorff Avenue / California Street", 33, 36),
(492959, 184890, "2014-10-10 16:10:00", "San Jose Civic Center", 3, "2014-10-12 19:32:00", "San Jose Civic Center", 3, 82),
(635263, 602338, "2015-02-08 03:09:00", "San Jose Civic Center", 3, "2015-02-15 02:28:00", "San Jose Civic Center", 3, 9),
(421286, 560792, "2014-08-23 09:48:00", "Rengstorff Avenue / California Street", 33, "2014-08-29 21:35:00", "Mountain View Caltrain Station", 28, 90),
(830135, 502617, "2015-07-01 14:12:00", "Redwood City Medical Center", 26, "2015-07-07 09:49:00", "Redwood City Caltrain Station", 22, 15),
(334213, 89376, "2014-06-22 12:42:00", "University and Emerson", 35, "2014-06-23 13:32:00", "University and Emerson", 35, 42),
(39954, 272839, "2013-09-30 09:38:00", "Rengstorff Avenue / California Street", 33, "2013-10-03 13:25:00", "Rengstorff Avenue / California Street", 33, 13),
(288324, 7804, "2014-05-17 16:48:00", "Castro Street and El Camino Real", 32, "2014-05-18 14:29:00", "San Jose Diridon Caltrain Station", 2, 18),
(635263, 602338, "2015-02-08 03:09:00", "San Jose Civic Center", 3, "2015-02-15 02:28:00", "San Jose Civic Center", 3, 9),
(492959, 184890, "2014-10-10 16:10:00", "San Jose Civic Center", 3, "2014-10-12 19:32:00", "San Jose Civic Center", 3, 82),
(5088, 183, "2013-08-29 22:08:00", "Market at 4th", 76, "2013-08-29 22:12:00", "Post at Kearney", 47, 309),
(4298, 460, "2013-08-29 12:02:00", "Cowper at University", 37, "2013-08-29 12:10:00", "University and Emerson", 35, 9),
(7900, 1887, "2013-09-01 13:47:00", "Evelyn Park and Ride", 30, "2013-09-01 14:19:00", "Evelyn Park and Ride", 30, 10),
(5007, 1016, "2013-08-29 20:11:00", "Rengstorff Avenue / California Street", 33, "2013-08-29 20:28:00", "Rengstorff Avenue / California Street", 33, 11),
(6210, 608, "2013-08-30 17:15:00", "SJSU - San Salvador at 9th", 16, "2013-08-30 17:26:00", "San Salvador at 1st", 8, 12),
(4121, 1040, "2013-08-29 10:13:00", "University and Emerson", 35, "2013-08-29 10:31:00", "California Ave Caltrain Station", 36, 13),
(6730, 2503, "2013-08-31 11:55:00", "Rengstorff Avenue / California Street", 33, "2013-08-31 12:37:00", "Park at Olive", 38, 14),
(6978, 689, "2013-08-31 14:12:00", "Cowper at University", 37, "2013-08-31 14:24:00", "California Ave Caltrain Station", 36, 15),
(10112, 618, "2013-09-03 18:20:00", "Palo Alto Caltrain Station", 34, "2013-09-03 18:30:00", "California Ave Caltrain Station", 36, 17),
(7014, 680, "2013-08-31 14:27:00", "Evelyn Park and Ride", 30, "2013-08-31 14:38:00", "Mountain View Caltrain Station", 28, 27);
Например, следующий кортеж из таблицы поездок:
(5088, 183, "2013-08-29 22:08:00", "Market at 4th", 76, "2013-08-29 22:12:00", "Post at Kearney", 47, 309)
означает, что велосипед #309
совершил поездку #5088
со станции #76
"Market at 4th"
в 2013-08-29 22:08:00
на станцию #47
"Post at Kearney"
на 2013-08-29 22:12:00.
WITH dates AS (SELECT date(start_time) AS tdate
FROM trip
UNION
SELECT date(end_time) AS tdate
FROM trip)
SELECT tdate,
ROUND(SUM(strftime('%s', MIN(datetime(end_time), datetime(tdate, '+1
day'))) - strftime('%s', MAX(datetime(start_time), datetime(tdate))))
* 1.0 / (SELECT count(distinct(bike_id))
FROM trip
WHERE bike_id <= 100), 4) AS avg_duration
FROM trip, dates
WHERE bike_id <= 100
AND datetime(start_time) < datetime(tdate, '+1 day')
AND datetime(end_time) > datetime(tdate)
GROUP BY tdate
ORDER BY avg_duration DESC LIMIT 10;
Выход:
2014-07-13 3884.1758
2014-10-12 3398.9011
2015-02-14 2728.3516
2014-08-29 2669.011
2015-07-04 2666.3736
2014-06-23 2653.1868
2013-10-01 2634.7253
2014-05-18 2618.2418
2015-02-15 2582.6374
2014-10-11 2555.6044