Что делает следующий код перед оператором GROUP BY, начинающимся с ROUND (SUM)? - PullRequest
0 голосов
/ 25 июня 2019

Я прохожу курс 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...