#mysql #sql #fraud-prevention
Вопрос:
Я пытаюсь найти способ создать запрос, который возвращает транзакции от физических лиц, когда они отправляют транзакции, которые традиционно сопровождаются другими транзакциями.
Пример (с приведенными ниже данными):
Мы видим, что у сотрудников был куплен рейс (с датой покупки рейса). Затем они представили сборы за багаж с датами транзакций, которые совпадают либо с датой вылета, либо с датой возвращения. Затем мы видим, что они отправили третье письмо, которое не соответствует ни одной из дат авиакомпании.
Есть ли способ идентифицировать каждого человека, с которого взимается плата за провоз багажа, если у него есть дата вылета/возвращения авиакомпании, соответствующая дате транзакции? В приведенном ниже примере последние сборы за багаж для каждого сотрудника-это строки, которые я надеюсь вернуть, поскольку они не соответствуют дате вылета/возвращения для соответствующих рейсов.
ИМЯ БД = подлежащее расходованию
Работник | Тип | Дата транзакции | Уезжать | Возврат |
---|---|---|---|---|
123 | Авиакомпания | 12052019 | 12082019 | 12132019 |
123 | Багаж | 12082019 | нулевой | нулевой |
123 | Багаж | 12132019 | нулевой | нулевой |
123 | Багаж | 12252019 | нулевой | нулевой |
567 | Авиакомпания | 11052020 | 11082020 | 11132020 |
567 | Багаж | 11082020 | нулевой | нулевой |
567 | Багаж | 11132020 | нулевой | нулевой |
567 | Багаж | 11252020 | нулевой | нулевой |
Комментарии:
1. Пожалуйста, объясните, что такое «мошенническая транзакция», или уберите это из вопроса. Кроме того, SQL не выделяет строки. Запрос просто возвращает строки. Какой набор результатов вы хотите получить?
2. Пожалуйста, не кричите в названии. Это очень раздражает.
3. @GordonLinoff спасибо, обновил вопрос.
4. @tadman приношу извинения и хорошо подмечаю. Ошибка новичка с моей стороны. Я обновил приглашение.
Ответ №1:
Я думаю, вы могли бы использовать «ГДЕ НЕ СУЩЕСТВУЕТ», чтобы сделать то, что вы ищете. Что-то вроде этого:
SELECT *
FROM Transactions T1
WHERE T1.Type = 'Baggage'
AND NOT EXISTS (
SELECT *
FROM Transactions T2
WHERE T2.Type = 'Airline'
AND (T1.TransactionDate = T2.Depart OR T1.TransationDate = T2.Arrive)
)
НЕ СУЩЕСТВУЕТ исключает любые записи о багаже, которые имеют соответствующую запись авиакомпании, основанную либо на дате вылета, либо на дате прибытия. (Помещение СУЩЕСТВУЕТ само по себе сделало бы opposite…it будут отображаться только операции с багажом, соответствующие операциям авиакомпании.) Вероятно, вы могли бы сделать это с помощью объединения, но EXISTS/NOT EXISTS-это хорошо, потому что это не дает вам повторяющихся строк в вашем результирующем наборе.
Комментарии:
1. Я попробовал предложенный код, но он не вернул никаких значений. Когда вы пишете «ИЗ Trasnactions T1, ГДЕ T1.Type = «Багаж»», что это делает? Я предполагаю, что он создает таблицу только со строками багажа? Затем мы пытаемся взять дату транзакции и сопоставить даты вылета/возвращения авиакомпании в подзапросе, возвращая строки, которые не совпадают? Я ввел свой ИЗ [вставить имя базы данных] , где Тип = багаж. Я предполагаю, что в моей версии отсутствует один шаг?
2. Это мое предположение о том, как называются ваши столы. На самом деле я не знаю, что у вас есть таблица под названием «Транзакции».
3. сработало! огромное спасибо за помощь! Мне пришлось изменить способ, которым я называл свою таблицу. Очень ценю вашу помощь @Jim