У меня есть таблица MySQL для данных, содержащих прибыль для поездок такси /uber со следующими полями:
id
ride_date
ride_earnings
ride_tips
Я пытаюсь получить список самых "прибыльных" дат, я могу сделать:
SELECT DATE(ride_date) as d, SUM(ride_earnings+ride_tips) as total, COUNT(id) as ride_count
FROM rides
GROUP by d
ORDER BY total DESC
Но мне нужно сгруппировать их, как все поездки с 12 вечера в один день - 12 вечера на следующий день. Заранее спасибо!
EDIT: изменено с 12p до 12p, чтобы сделать его более простым
EDIT2: Кроме того, я должен был сказать об этом, но я буду тянуть эти данные через PHP, поэтому я бы предпочел это в одном заявлении
SELECT
DATE(ride_date - interval 5 hour) as d,
SUM(ride_earnings+ride_tips) as total,
COUNT(id) as ride_count
FROM rides
WHERE time(ride_date) >= '17:00:00'
OR time(ride_date) <= '05:00:00'
GROUP by d
order by total DESC
DATE(ride_date - interval 5 hour)
будет считать утренние часы (0:00 - 5:00) днем ранее. Предложение WHERE гарантирует, что будут учитываться только поездки с 17:00 до 24:00 и с 00:00 до 05:00.
Примечание. Пожалуйста, не изменяйте свой вопрос таким образом, чтобы недействительные ответы.
SELECT
DATE(ride_date - interval 12 hour) as d,
SUM(ride_earnings+ride_tips) as total,
COUNT(id) as ride_count
FROM rides
GROUP by d
order by total DESC
Здесь первые 12 часов дня будут засчитаны накануне. Предложение WHERE в этом случае не требуется.
создайте временную таблицу, содержащую даты, которые вам нужно группировать. например (синтаксис t_sql):
declare @startDate date, @endDate.
select @startDate=min(ride_date), @endDate=max(ride_date) from rides
declare @tempDate date=dateAdd(dd,-1,@startDate)
declare @dateIntervals table(starDT dateTime, endDT dateTime)
while(@tempDate<@endDate) begin
insert into @dateIntervals
values(cast(@tempDate as DateTime)+'05:00:00',cast(dateAdd(dd,1,@tempDate) as DateTime)+'05:00:00')
select @tempDate=dateAdd(dd, 1,@tempDate)
end
select t1.startDT as d, SUM(ride_earnings+ride_tips) as total, COUNT(id) as ride_count
from @dateIntervals t1
left join rides t2 on t2.ride_date>=t1.startDT and t2.ridetDate<t2.endDT
GROUP by d
order by total DESC
1 errors were found during analysis. Unrecognized statement type. (near "declare" at position 0)
пытаться:
SELECT DATE(ride_date) as d, SUM(ride_earnings+ride_tips) as total, COUNT(id) as ride_count FROM rides
WHERE HOUR(ride_date) < 17 AND HOUR(ride_date) > 5
GROUP by d order by total DESC
HOUR(ride_date) > 17 AND HOUR(ride_date) < 5
- Это невозможно.
ride_date
являетсяride_date
данных DATE, нет никакого способа узнать, было ли это до или после5am
или5pm
.