2013-10-07 4 views
1

Я работаю для проекта, которые имеют следующую таблицу структуруРассчитать Скорость на основе диапазона расстояний

 
start | end | rate 
------------------ 
    1 | 50 | 10 
    51 | 100 | 20 
101 | 150 | 40 
151 | 200 | 80 
201 | 0 |100 

Вот последняя запись означает, что 200 к бесконечному значению имеет скорость как 100

Здесь у меня есть для расчета общей скорости на основе значений начальных и конечных данных пользователей

Я пробовал следующий запрос в MySQL для начала ввода - 30, конечные - 170

SELECT SUM((end+1 - start) * amount) 
FROM table 
WHERE start > 30 
AND end < 170 

, который дает только 2 и сумму 3-й записи, тогда я должен запросить для первой и последней записей отдельно.

Как я могу достичь этого в одном запросе?

+1

Я правильно понимаю, что по мере того, как начало идет вверх, ставка повышается, поэтому, если вы начинаете с 30 и переходите к 170, тогда математика будет '(20 * 10) + (49 * 20) + (49 * 40) + (19 * 80) '? – Casey

+0

Просьба поделиться фактической формулой для расчета скорости ... –

+0

Вы правы, но с небольшой коррекцией математика будет

(20*10)+(50*20)+(50*40)+(20*80)
Kanagu

ответ

1

Давайте предположим, что мы следующие два параметра объявлены:

set @start = 30, @end = 170; 

Во-первых, чтобы получить строки, которые находятся в пределах вашего диапазона (перекрывающей), мы будем делать (SQL Fiddle):

select start, end 
from Table1 
where start <= @end OR end >= @start 

Тогда мы массируем начало и конец диапазонов для первого и последнего рядов. В основном мы укупорка первой части диапазона на @start и вторую часть диапазона на @end (SQL Fiddle):

select CASE WHEN @start > start THEN @start ELSE start END AS start, 
    CASE WHEN @end < end THEN @end ELSE end END AS end 
from Table1 
where start <= @end OR end >= @start 

Тогда мы можем вычесть эти два конкретных выражение, чтобы получить расстояние. И не забудьте добавить 1, если вы хотите включительно расстояние (SQL Fiddle):

select CASE WHEN @end < end THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start END + 1 AS dist 
from Table1 
where start <= @end OR end >= @start 

Умножить на скорости. На этот раз не забудьте скобки, так как умножение имеет приоритет (SQL Fiddle):

select rate * (CASE WHEN @end < end THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start END + 1) 
from Table1 
where start <= @end OR end >= @start 

И, наконец, хлопнуть SUM вокруг всего выражения, чтобы добавить все это (SQL Fiddle):

select SUM(rate * (CASE WHEN @end < end THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start END)) 
from Table1 
where start <= @end OR end >= @start 
+0

Вместо условия условия where, которое мы должны использовать и условие, тогда нужно проверить, чтобы конечное значение 0 было бесконечным, начальное и конечное значение могут меняться, если start - 230 и end 270, тогда расчет должен быть 40 * 100 = 400 – Kanagu

+1

@ Kanagu Если у вас есть какой-либо контроль над схемой данных, я предлагаю вам использовать 'NULL' вместо' 0' для определения бесконечности. Затем вы можете применить ограничение 'end> = start OR start NULL ИЛИ end IS NULL', и математика имеет смысл с несколькими дополнительными настройками для' NULL'. –

1

. на основе алгоритма ОГО, вы можете запустить в MySQL:

SET @start = 30, @end = 170; 

SELECT 
    sum(rate * (least(`end`, @end) - greatest(start, @start) + 1)) TotalRate 
FROM Table1 
WHERE @end >= start OR @start <= `end` 
0

основы @lc внушения, следующий запрос подходящий, ле моих ожиданий

SET @start=30, @end=170; 
    SELECT SUM(rat*(CASE WHEN @end < end or end=0 THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start-1 END)) as price 
    FROM rate 
    WHERE start <= @end and (end >= @start or end=0) 

и этот запрос отвечает следующим критериям

при старте-60, в конце-140, то математика будет (40*20)+(40*40)=2400

при пуске-230, конец 270, то math будет (40*100)=400

Смежные вопросы