Я работаю над устранением дубликатов в приведенных выше данных, где мне нужно исключить данные с той же суммой, где категория = «Собственная»
Как вы можете заметить в примере данных, который я создал, все даты из категории = продавца всегда относятся к первому дню месяца, а в собственной категории всегда разные, что доставляет мне головную боль, чтобы придумать логику того, как это решить.
Категории «Собственный» и «Продавец» объединены в таблице 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
Есть ли какой-то подход к решению этой проблемы?
Я добавил MySQL намеренно, чтобы получить хоть какую-то логику от экспертов, как ее решить. Идеи.
Цените это, спасибо. Сейчас обновил теги.
все даты из категории = продавца всегда относятся к первому дню месяца. Содержит ли структура вашей таблицы соответствующее ограничение CHECK? если нет, то вы слишком самонадеянны.
Те, у кого категория = own, взяты из внешней таблицы. это означает, что это из двух разных источников, и я использовал таблицу CTE для объединения данных с помощью объединения. Здесь показан окончательный SELECT, и мне нужно придумать решение для удаления повторяющегося сценария, о котором я упоминал.
Что делать, если в одном месяце существуют две строки «Собственные» с одинаковой суммой? Возможно, вам стоит исправить свой союз
Обновлено описание для более подробной информации
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
)
Ценю это, я пробую логику здесь
@LetSooGas Ответ, предоставленный Мухаммадом Хунаином, реализует ту же логику, и если вы используете NOT EXISTS вместо WHERE NOT IN в его решении, то такой запрос должен быть самым быстрым ...
хорошо, я пытаюсь применить это к своему коду. Кстати, я обновил описание.
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
Затем вам нужно использовать group by, чтобы сгруппировать повторяющиеся записи в одну запись. Или просто попробуйте выбрать отдельный вместо выбора
Итак, из вашего вопроса я понимаю, что вы хотите пропустить свой собственный, только если его сумма уже существует в строке продавца. Я придумал эту логику, которую вы можете оптимизировать, используя правильные переменные для повторного использования таблицы. Я просто даю вам представление о том, что это можно сделать так. вы можете добавить это в свой текущий запрос, как хотите.
select * from TestTable where Category <> 'Own'
union
select * from TestTable where Category = 'Own' and Amount not in (
select Amount from TestTable where Category <> 'Own'
)
Ценю это, я пробую логику здесь
Я пробовал это, но он исключает всех тех, у кого одинаковая сумма, независимо от их дат. Нужен ли мне снова подзапрос в предложении where для сравнения дат? Даты в категории «Собственный» всегда должны быть преобразованы в первый день месяца, чтобы сравнить их с категорией «Продавец».
Можете ли вы объяснить мне, что вы на самом деле хотите с датой, чтобы я мог предоставить соответствующий запрос, спасибо.
Для того, чтобы сравнить сумму в собственной категории, также следует учитывать дату. Как на скриншоте, который я предоставил. Пример для месяца февраль. Та же сумма, но разные даты. Моя идея состоит в том, чтобы преобразовать дату, а затем сравнить сумму. Я прав? Я также обновил описание в своем посте.
У меня есть вопрос: может ли быть несколько записей о продавцах в течение одного месяца с одним и тем же продуктом? в основном есть какое-либо уникальное поле init?
Да, есть несколько записей о продавцах за один месяц. Account = AccountID, так что это уникальный идентификатор, и я просто указал тот же AccountID на снимке экрана моего примера, чтобы показать поток записей каждый месяц.
Похоже, вам нужно номер строки по месяцам, а затем условно отфильтровать его
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);
Оххх человек! Вот чего мне не хватает! Это где фильтр предложений работает как по волшебству! Большое спасибо!
В соответствии с руководством по вопросам, пожалуйста, не публикуйте изображения кода, данных, сообщений об ошибках и т. д. - скопируйте или введите текст в вопрос. Пожалуйста, зарезервируйте использование изображений для диаграмм или демонстрации ошибок рендеринга, вещей, которые невозможно точно описать с помощью текста.