Запрос SQL Server - интервальные значения, максимально увеличивающие сумму - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужен запрос SQL Server, который возвращает два значения (t1 и t2), соответствующих ОДНОМУ десятичному полю, чтобы они определяли интервал, для которого определенная сумма увеличивается до максимума.SUM выполняется для успешных записей (результат поля> 0) и неудачных записей (результат поля <0).Другими словами: в каком сегменте стоимости оптимизируется чистый результат?Есть идеи?Заранее спасибо! </p>

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

-table "Операции" - это целевая таблица SQL, эти запросы будут включать соответствующие поля: SELECT t from operations where result > 0

SELECT COUNT(*) AS num from operations where result > 0

-поле "t" является десятичным значением, я ищу 2 значения "t", например, "t1 = 1.25" и "t2 = 2.6"

-поле "результат"является целочисленным значением, может быть> 0 (выигрывает, например, «15») или <0 (проигрывает, например, «-10») </p>

- Следующий запрос работает нормально, возвращая интервал для«t» (t1 и t2) произвольно определяется как t> 1 и t <1.5: <code>SELECT DISTINCT (select MIN(t) from operations where t > 1) As t1, (select MAX(t) from operations where t < 1.5) As t2 from operations ЦЕЛЬ: -table «операций» содержит около 500 записей, некоторые из них успешны («результат»> 0) или неуспешны (»result "<0)," t "- это десятичное поле с несколькими значениями, скажем, от 1,2 до 5,8 - для упрощения, скажем, что у нас есть только эти 2 поля," t "и" result "- что такое 2значения для t (t1 и t2), так что для t> t1 и t

+------------+-------------+
| t          | result      |
+------------+-------------+
| 1.25       |          15 |
| 1.1        |         -12 |
| 3.8        |          10 |
+------------+-------------+

Для этого небольшого набора записей ожидаемые значения t будут t1 = 1,25 и t2 = 3,8, поскольку в интервале 1,25 <= t <= 3,8 результаты максимизируются (итоговые результаты= 15 + 10 = 25).Например, 1,1 <= t <= 1,25 приведет к общим результатам = 15-12 = 3, что не является оптимальным. </p>

1 Ответ

0 голосов
/ 11 декабря 2018

Если вы получаете 2 верхних, упорядоченных по результату, и включаете ROW_NUMBER.
Затем, исходя из номера строки, вы можете знать t1 и t2.

SELECT 
MAX(case when rn = 1 then t end) as t1, 
MAX(case when rn = 2 then t end) as t2, 
MAX(case when rn = 1 then result end) as result1, 
MAX(case when rn = 2 then result end) as result2,
SUM(result) as optimum
FROM
(
  SELECT result, t, ROW_NUMBER() OVER (ORDER BY t) as rn
  FROM
  (
    SELECT TOP 2 result, t
    FROM operations
    WHERE t BETWEEN 1.00 AND 4.00
    ORDER BY result DESC
  ) q1
) q2;

Результат:

t1      t2      result1 result2 optimum
1.25    3.80    15      10      25
...