Значения поиска основаны исключительно на минимальном значении диапазона - PullRequest
1 голос
/ 19 июня 2020

Я хочу разместить значения в пределах диапазона, заданного только минимальным значением, аналогично использованию ВПР / ГПР в Excel с использованием критерия «ЛОЖЬ».

Как видно ниже, TableScore перечисляет нижние пороговые значения (CutpointVal) для значения, которое должно быть присвоено определенное c количество точек (минимальное значение в диапазоне). Приведенный ниже код SQL выполняет это в два этапа, при этом первый запрос генерирует таблицу, которая включает высокое значение для каждого низкого значения, таким образом создавая полный диапазон.

Однако это несколько неуклюжий способ сделать это, особенно когда вы пытаетесь повторить это много раз. Исходная таблица (TableScore) не может быть изменена для включения высоких значений. Есть ли способ реализовать sh аналогичный механизм только с одним запросом?

Main

ID              Score
72625           2.5
78261           3.2
82766           4.7
58383           0.3

TableScore

CutpointVal     Points
0               0
0.3             1
1.2             2
2.7             3
3.4             4

Запрос верхнего и нижнего диапазона (RangeQry):

SELECT a.CutpointVal AS LowVal, Val(Nz((SELECT TOP 1 [CutpointVal]-0.001
FROM TableScore b
WHERE b.Points > a.Points
ORDER BY b.Points ASC),9999)) AS HighVal, a.Points
FROM TableScore AS a
ORDER BY a.Points;

Запрос назначения диапазона:

SELECT Main.ID, Main.Score, RangeQry.LowVal, RangeQry.HighVal, RangeQry.Points AS PTS
FROM RangeQry, Main
WHERE (((Main.Score) Between [RangeQry].[LowVal] And [RangeQry].[HighVal]));

Желаемый результат:

ID        Score        Points
72625     2.5          2
78261     3.2          3
82766     4.7          4
58383     0.3          1

1 Ответ

0 голосов
/ 20 июня 2020

Рассмотрим:

SELECT Main.ID, Main.Score, (
    SELECT Max(Points) FROM TableScore WHERE CutpointVal<=Main.Score) AS Pts
FROM Main;

Или

SELECT Main.ID, Main.Score, (
    SELECT TOP 1 Points FROM TableScore 
    WHERE CutpointVal <= Main.Score 
    ORDER BY Points DESC) AS Pts
FROM Main;

Или

SELECT Main.ID, Main.Score, DMax("Points","TableScore","CutpointVal<=" & [Score]) AS Pts
FROM Main;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...