Как вы сопоставляете цифры (зарплаты) с диапазоном? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть данные о зарплате, и я пытаюсь сопоставить их с диапазоном в другой таблице.

Например, таблица salary:

| id | amount | currency | 
|----+--------+----------|
|  A |  11111 |      USD |
|  B |   5000 |      EUR | 
|  C |  45000 |      RMB |
|  D | 100000 |      USD |
|  E | 110000 |      EUR |
|  F |  67000 |      RMB |

У меня есть другая таблица, bands_pay с label, которая обозначает диапазон зарплаты.Например:

| label |       range     | currency | 
|-------+-----------------+----------|
|    1A |   10000 - 15000 |      USD |
|    2C | 100000 - 149999 |      EUR | 
|    3P |   25000 - 49999 |      RMB |
|    4F |   35000 - 49999 |      EUR |
|    5B |     5000 - 9999 |      EUR |
|    6Q | 100000 - 124999 |      USD |
|    7F |   50000 - 74999 |      RMB |

Как можно объединить эти таблицы, чтобы получить все содержимое таблицы salary и с правильным label?

| id | amount | currency | label |
|----+--------+----------+-------|
|  A |  11111 |      USD |    1A |
|  B |   5000 |      EUR |    5B |
|  C |  45000 |      RMB |    3P |
|  D | 100000 |      USD |    6Q |
|  E | 110000 |      EUR |    2C |
|  F |  67000 |      RMB |    7F |

Ответы [ 3 ]

0 голосов
/ 18 марта 2019

Вы можете использовать numrange для этой цели. Описание здесь .

Например:

With SalaryRanges(SalaryRange) AS (
VALUES(NumRange(0,5000)), (Numrange(5000,10000)), (NumRange(10000,15000)), (NumRange(15000,25000)), (NumRange(25000,50000)), (NumRange(50000,100000)), (NumRange(100000,150000))
),
Salary(id, amount, currency, label) as (
    SELECT UNNEST(ARRAY['A','B','C','D','E','F']),
    UNNEST(ARRAY[11111,5000,45000,100000,110000,670000]::numeric[]),
    UNNEST(ARRAY['USD','EUR', 'RMB', 'USD','EUR', 'RMB']),
    UNNEST(ARRAY['1A','5B','3P','6Q','2C','7F'])
)
SELECT *
FROM Salary S
JOIN SalaryRanges SR on SalaryRange @> Amount

Если вы решите сохранить диапазоны в таблице, вы, вероятно, захотите создать исключающее ограничение .
В противном случае вам нужно будет решить, что делать с перекрывающимися диапазонами.

0 голосов
/ 18 марта 2019

Поскольку значения вашего диапазона не находятся в отдельных столбцах (было бы лучше, если бы они были), сначала нужно разделить столбец range, используя regexp_split_to_array, затем объединить две таблицы и проверить, какой диапазон соответствует количеству каждого заработная плата:

select s.id, s.amount, s.currency, bp.label from salary s join (
select a[1] as from, a[2] as to
from (
    select regexp_split_to_array(range, '-')
    from bands_pay
     ) as dt(a)) bp
on s.id >= bp.from and s.id <= bp.to
0 голосов
/ 18 марта 2019

Вы должны разделить столбец диапазона на 2 столбца:

-label -start range -end range -currency

, а затем:

select salary.id,salary.amount,salary.currency,bands_pay.range
from salary,bands_pay
where
bands_pay.start_range<=salary.amount and salary.amount<bands_pay.end_range
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...