Как сравнить значения в нескольких полях для каждого идентификатора в таблице - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица с информацией о предупреждениях для заказов на замену. (Br) (br) Мне нужно подтвердить для каждого оповещения, что для каждого идентификатора заказа в идентификаторе оповещения: Имена покупателя совпадают Оплаченная дата отличается для каждого оповещения.

Alert_ID | Order_ID | Buyer_ID | Item  | Quantity | Paid_date
01       | 001A     | Adam     | Apple | 2        | 01/01/2019
01       | 001A     | Adam     | Orange| 3        | 01/01/2019
01       | 001B     | Adam     | Apple | 4        | 01/03/2019
01       | 001B     | Adam     | Orange| 3        | 01/03/2019
01       | 001C     | Adam     | Apple | 3        | 01/07/2019
01       | 001C     | Adam     | Orange| 3        | 01/07/2019
02       | 002A     | Pam      | Banana| 2        | 01/21/2019
02       | 002A     | Pam      | Grapes| 1        | 01/21/2019
02       | 002B     | Pam      | Banana| 2        | 01/30/2019
02       | 001B     | Pam      | Grapes| 4        | 01/30/2019
04       | 004A     | Dave     | Apple | 2        | 01/01/2019
04       | 004B     | Mary     | Apple | 3        | 01/01/2019

Первоначально это было отношение 1: 1 заменяющих требований к первоначальным требованиям.

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

select
        *
from
        (
                with repl as(
                        select
                                Alert_ID, Order_ID, Buyer_ID, Paid_date
                                ROW_NUMBER () over(partition by alert_id order by alert_id, Order_id) AS RN
                        from <MY ALERT TABLE>
                )
                SELECT * FROM repl WHERE RN = 1
        ) A
        LEFT JOIN 
        (
                with repl as(
                        select
                                Alert_ID, Order_ID, Buyer_ID, Paid_date
                                ROW_NUMBER () over(partition by alert_id order by alert_id, Order_id) AS RN
                        from <MY ALERT TABLE>
                )
                SELECT R1.* 
                FROM repl R1 
                LEFT OUTER JOIN repl R2
                ON R1.ALERT_ID = R2.ALERT_ID AND R1.RN < R2.RN
                WHERE R2.RN IS NULL
        ) B
        ON A.ALERT_ID = B.ALERT_ID
WHERE

        a.order_id=b.order_id
        and a.buyer_id <> b.buyer_id
        and a.paid_date > b.paid_date

Это работало нормально для 1: 1, но с 1: n я проиграл все ордера, которые появляются между первым и последним номером строки.

Ожидаемый результат:
Возврат исключений из правил

Alert_ID | Order_ID | Buyer_ID | Item  | Quantity | Paid_date
04       | 004A     | Dave     | Apple | 2        | 01/01/2019
04       | 004B     | Mary     | Apple | 3        | 01/01/2019

1 Ответ

0 голосов
/ 05 июля 2019

Хотите получить исключения - то есть, alter_id / order_id пары с разными именами?

Если так:

select Alert_ID, Order_ID
from repl
group by Alert_ID, Order_ID
having min(buyer_id) <> max(buyer_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...