Дублирующиеся записи SQL с уникальным сценарием

Я работаю над устранением дубликатов в приведенных выше данных, где мне нужно исключить данные с той же суммой, где категория = «Собственная»

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

Категории «Собственный» и «Продавец» объединены в таблице CTE, поэтому даты в «Собственном» не совпадают.

Результат, который я ожидаю, состоит в том, чтобы получить все данные по обеим категориям, но если дубликат Amount существует в Own, его не следует включать, потому что это дубликат. Категория «Дата в собственном» всегда должна быть преобразована в первый день месяца, чтобы сравнить сумму и дату вместе.

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

WITH TestTable AS (
    SELECT --DATA FROM EXTERNAL TABLE
    Product,
    Account,
    Category = 'Own',
    Amount,
    Date
    FROM exttbl

    UNION

    SELECT
    Product,
    Account,
    Category = 'Seller',
    Amount,
    Date
    FROM inttbl
)

SELECT *
FROM (
    SELECT
    RowNum = ROW_NUMBER() OVER (PARTITION BY Product, Account, Amount, DATEADD(month, DATEDIFF(month, 0, date), 0) ORDER BY Date),
    Product,
    Account,
    Category,
    Amount,
    Date
    FROM TestTable
) a
WHERE a.RowNum = 1

Есть ли какой-то подход к решению этой проблемы?

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

Dale K 18.08.2023 07:40

Я добавил MySQL намеренно, чтобы получить хоть какую-то логику от экспертов, как ее решить. Идеи.

Let Soo Gas 18.08.2023 07:47

Цените это, спасибо. Сейчас обновил теги.

Let Soo Gas 18.08.2023 07:51

все даты из категории = продавца всегда относятся к первому дню месяца. Содержит ли структура вашей таблицы соответствующее ограничение CHECK? если нет, то вы слишком самонадеянны.

Akina 18.08.2023 07:58

Те, у кого категория = own, взяты из внешней таблицы. это означает, что это из двух разных источников, и я использовал таблицу CTE для объединения данных с помощью объединения. Здесь показан окончательный SELECT, и мне нужно придумать решение для удаления повторяющегося сценария, о котором я упоминал.

Let Soo Gas 18.08.2023 08:05

Что делать, если в одном месяце существуют две строки «Собственные» с одинаковой суммой? Возможно, вам стоит исправить свой союз

siggemannen 18.08.2023 08:10

Обновлено описание для более подробной информации

Let Soo Gas 18.08.2023 09:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
65
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

SELECT *
FROM TestTable t1
WHERE Category <> 'Own'
   OR NOT EXISTS ( SELECT NULL
                   FROM TestTable t2
                   WHERE DATETRUNC(month, t1.date) = t2.date
                     AND t2.Category = 'Seller'
                     AND t1.Product = t2.Product
                     AND t1.Account = t2.Account
                     AND t1.Amount = t2.Amount
                  )

Ценю это, я пробую логику здесь

Let Soo Gas 18.08.2023 08:30

@LetSooGas Ответ, предоставленный Мухаммадом Хунаином, реализует ту же логику, и если вы используете NOT EXISTS вместо WHERE NOT IN в его решении, то такой запрос должен быть самым быстрым ...

Akina 18.08.2023 08:47

хорошо, я пытаюсь применить это к своему коду. Кстати, я обновил описание.

Let Soo Gas 18.08.2023 09:20
SELECT *
    FROM (
        SELECT
        RowNum = ROW_NUMBER() OVER (PARTITION BY Product, Account, Amount ORDER BY Date),
        Product,
        Account,
        Category,
        Amount,
        Date
        FROM TestTable
WHERE Category='Seller'
    ) a
    WHERE a.RowNum = 1

Мне все еще нужно получить данные из Category = Own, только следует исключить дубликат Amount

Let Soo Gas 18.08.2023 08:20

Затем вам нужно использовать group by, чтобы сгруппировать повторяющиеся записи в одну запись. Или просто попробуйте выбрать отдельный вместо выбора

hamed danesh 18.08.2023 14:11

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

 select * from TestTable where Category <> 'Own'
    union 
    select * from TestTable where Category = 'Own' and Amount not in (
       select Amount from TestTable where Category <> 'Own'
    )

Ценю это, я пробую логику здесь

Let Soo Gas 18.08.2023 08:31

Я пробовал это, но он исключает всех тех, у кого одинаковая сумма, независимо от их дат. Нужен ли мне снова подзапрос в предложении where для сравнения дат? Даты в категории «Собственный» всегда должны быть преобразованы в первый день месяца, чтобы сравнить их с категорией «Продавец».

Let Soo Gas 18.08.2023 09:57

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

Muhammad Hunain 18.08.2023 10:01

Для того, чтобы сравнить сумму в собственной категории, также следует учитывать дату. Как на скриншоте, который я предоставил. Пример для месяца февраль. Та же сумма, но разные даты. Моя идея состоит в том, чтобы преобразовать дату, а затем сравнить сумму. Я прав? Я также обновил описание в своем посте.

Let Soo Gas 18.08.2023 10:07

У меня есть вопрос: может ли быть несколько записей о продавцах в течение одного месяца с одним и тем же продуктом? в основном есть какое-либо уникальное поле init?

Muhammad Hunain 18.08.2023 10:56

Да, есть несколько записей о продавцах за один месяц. Account = AccountID, так что это уникальный идентификатор, и я просто указал тот же AccountID на снимке экрана моего примера, чтобы показать поток записей каждый месяц.

Let Soo Gas 18.08.2023 11:01
Ответ принят как подходящий

Похоже, вам нужно номер строки по месяцам, а затем условно отфильтровать его

SELECT *
FROM (
    SELECT
      rn = ROW_NUMBER() OVER (PARTITION BY Product, Account, Amount, EOMONTH(Date) ORDER BY Date),
      Product,
      Account,
      Category,
      Amount,
      Date
    FROM YourTable t
) t
WHERE (Category = 'Seller' OR rn = 1);

Оххх человек! Вот чего мне не хватает! Это где фильтр предложений работает как по волшебству! Большое спасибо!

Let Soo Gas 18.08.2023 15:11

Другие вопросы по теме