SQL - 查找行之间的值

时间:2017-10-20 17:44:38

标签: sql between

我有两张桌子:

  • Employee表格包含2列NameSales
  • Rewards表格包含2列BonusRange

示例数据:

Employee                     Rewards

| Name | Sales |             | Bonus | Range |
+------+-------+             +-------+-------+
| John | 112   |             | 2     | 200   |
| Mary | 201   |             | 3     | 300   |
| Joe  | 400   |             | 5     | 500   |
| Jack | 300   |

如果他的销售额< = Rewards.Range,每位员工都应该从Rewords表中获得奖励。

我想选择Employee.NameRewards.Bonus

在这种情况下,结果应为:

| Name | Bonus |
+------+-------+
| John | 2     |
| Mary | 3     |
| Joe  | 5     |
| Jack | 3     |

知道这个SQL查询会是什么吗?

谢谢, ZB

4 个答案:

答案 0 :(得分:1)

我建议采用这种方法。可能存在一两个语法错误。

select name
, (select bonus from rewards
where range =
(select min(range)
from rewards
where range >= sales)
)
from employee

答案 1 :(得分:1)

我刚测试了这一个,它用你的测试表检索了正确的结果:

SELECT   a.name,
         MIN(b.bonus) AS bonus
FROM db.employee a
INNER JOIN db.rewards b
ON a.sales <= b.range
GROUP BY a.name;

答案 2 :(得分:0)

我会使用lag获取每个范围的底部部分并将其加入员工的桌面:

SELECT name, bonus
FROM   employee e
JOIN   (SELECT bonus, 
               range AS top_range,
               COALESCE(LAG(range) OVER (ORDER BY bonus ASC), 0) AS bottom_range
        FROM   rewards) r ON e.sales BETWEEN r.bottom_range AND r.top_range

答案 3 :(得分:0)

;with OrderedBonuses as (
    select  e.name, r.bonus, row_number() over (partition by e.name order by r.Range desc) as ord
    from    Employee e
            JOIN Rewards r on e.Sales <= r.Range
)
select  name, bonus
from    OrderedBonuses
where   ord = 1;