внутреннее соединение выбирает только одну строку из второй таблицы на основе оператора IF-THEN-ELSE - PullRequest
1 голос
/ 15 октября 2019

У меня есть таблица пользователей. Каждая запись имеет одну или несколько цен, даты и состояния в таблице платежей. Я просто собираюсь показать по этому приоритету:

 priority 1 => green (with older date)
 priority 2 => green (with new date)
 priority 3 => yellow (with older date if amount>1000)

таблица пользователей

╔════╦══════════════╗
║ id ║  name        ║
╠════╬══════════════║
║  1 ║ Jeff_1       ║
║  2 ║ Jeff_2       ║
║  3 ║ Jeff_3       ║
╚════╩══════════════╝

таблица платежей

╔═══════════════════════════════════╗
║ user_id  state  price    date     ║
╠═══════════════════════════════════╣
║ 1       green   5000   2019-10-14 ║
║ 1       green   3500   2019-10-11 ║
║ 1       yellow  1000   2019-10-09 ║
║ 2       yellow  50     2019-10-06 ║
║ 2       yellow  4000   2019-10-25 ║
║ 3       yellow  45900  2019-10-02 ║
║ 3       yellow  4000   2019-10-29 ║
╚═══════════════════════════════════╝

сумма => 1000

Что я хочу:

╔═══════════════════════════════════╗
║ user_id  state  price    date     ║
╠═══════════════════════════════════╣
║ 1       green   3500   2019-10-11 ║
║ 2       yellow  4000   2019-10-25 ║
║ 3       yellow  45900  2019-10-02 ║
╚═══════════════════════════════════╝

Ответы [ 4 ]

0 голосов
/ 15 октября 2019

Вам нужно использовать аналитическую функцию следующим образом.

select t.*
from 
  (select t.*,
    row_number() 
      over (partition by user_id 
        order by state, case when state= 'yellow' and price >1000 then 1 end desc, date) as rn
    from payments t
   where state = 'green' or
    (state = 'yellow' and amount > 1000) 
  )t
where rn = 1;

Ура !!

0 голосов
/ 15 октября 2019

Используйте следующий скрипт:

select u.user_id, payment.state, payment.price, payment.date 
from users u
outer apply(select top 1 * from payments p 
            where p.user_id = u.user_id
            and (p.state = 'green' or (p.state = 'yellow' and p.price > 1000))
            order by p.date)payment
0 голосов
/ 15 октября 2019

Если я правильно понимаю вашу проблему, вы хотите вернуть результат 3 запросов, каждый из которых получает записи с заданным приоритетом, поэтому

(select ..., 1 as priority from ...
union all
select ..., 2 as priority from ...
union all
select ..., 3 as priority from ...)
order by priority
0 голосов
/ 15 октября 2019

Использование row_number():

select p.*
from (select p.*,
             row_number() over (partition by user_id
                                order by (case when state = 'green' then 1 else 2 end),
                                         date asc
                               ) as seqnum
      from payments p
      where state = 'green' or
            (state = 'yellow' and amount > 1000)
     ) p
where seqnum = 1;

Предполагается, что вам нужны только эти три приоритета. То есть, если ни одна строка не соответствует, вы не хотите, чтобы пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...