Вы можете реализовать логику, используя CASE
, например:
SELECT pct, CASE
WHEN pct >= 100 THEN 'GREEN'
WHEN pct >= 50 THEN 'AMBER'
WHEN pct >= 20 then 'ORANGE'
ELSE 'RED'
END
FROM mytable
CASE
останавливается на первом условии соответствия (следовательно, нет необходимости писать WHEN pct >= 50 AND pct < 100
, например, так как pct >= 100
являетсяуже перехвачено предыдущим условием.
Если вы используете отдельную таблицу для хранения нижней границы каждого интервала (например, myranges
), как показано в вашем примере, и вы ищете JOIN
это с таблицей, которая содержит фактические данные (например, mydata
), тогда это немного сложнее: вам нужно убедиться, что вы объединяетесь с соответствующей записью диапазона:
SELECT d.*, r.*
FROM mydata d
INNER JOIN myranges r
ON d.value >= r.pct
AND (
LEAD (r.pct) OVER (ORDER BY pct) IS NULL
OR d.value < LEAD (r.pct) OVER (ORDER BY pct)
)