Советы по выводу списка на основе приоритетного столбца - PullRequest
2 голосов
/ 31 июля 2009

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

У кого-нибудь есть хорошие советы по наиболее эффективному t-SQL для дедупликации этого списка?

В основном у меня есть:

SELECT a.*, b.priority 
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId

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

DELETE ta
FROM #tmp ta
JOIN #tmp tb
ON ta.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority

Таблица A имеет одинаковые столбцы для двух источников, но данные могут отличаться - поэтому они могут иметь разные цены. Проблема в том, что я должен взять цену (и всю другую информацию) из строки, которая поступает из источника с наивысшим приоритетом. Чтобы усложнить ситуацию, у меня нет данных для каждого элемента из всех источников.

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

Ответы [ 2 ]

1 голос
/ 31 июля 2009

Я думаю, вы могли бы сделать что-то вроде этого:

SELECT a.*, b.priority 
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId and b.priority = (select max(priority) from tableB where b.sourceId = a.sourceId)

Не могу вспомнить, будет ли tSql иметь область действия для подзапроса или нет.

0 голосов
/ 31 июля 2009

Попробуйте использовать ROW_NUMBER, чтобы найти те, которые вы хотите сохранить, а затем избавиться от остальных.

... и не забудьте завершить предыдущее утверждение точкой с запятой ...

with t as (
SELECT a.*, row_number() over (partition by a.sourceid order by b.priority desc) as priorityorder
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
)
--select * from t
delete t 
where priorityorder > 1;

Rob

...