SQL: необходимо создать две уникальные записи для каждой записи - PullRequest
0 голосов
/ 17 декабря 2010

Простой вопрос: как взять набор записей с PK и создать ровно две записи для каждого источника со слегка измененным ключом для дубликата?Другими словами, я беру 4000 записей и создаю 8000 записей, где 4000 идентичны, а остальные 4000 имеют слегка измененный ключ.Я не могу сделать объединение, потому что по сути это два выбора (длинная история).

Остальное усложняется, но, возможно, необходимо привести примеры.

Это мой оригинальный набор (он содержит более 4000записи)

dateGroup areaGroup itemID editionID
   1          1        1       1
   1          1        1       2
   1          2        1       1
   1          2        2       1

   2          1        1       1
   2          1        1       2
   2          2        1       1
   2          2        1       2

Для каждой записи мне нужно создать повторяющуюся запись, объединяющую areaGroups вместе под '0', затем создать разделенный запятыми список оригинальных areaGroups как отдельное поле.(«Почему» - какой-то тупой программист (я) допустил ошибку около 15 лет назад.) Я могу изменить нумерацию editionID по мере необходимости, но исходная и дублирующаяся запись должны иметь одинаковый editionID (таким образом, объединение не будет работать),PK остается таким же, как указано выше (все поля)

dateGroup areaGroup itemID editionID aGroups
   1          0        1       1        1
   1          0        1       2        1
   1          0        1       1        2    // Duplicate (EditionID)
   1          0        2       1        2
   2          0        1       1        1
   2          0        1       2        1
   2          0        1       1        2    // Duplicate (EditionID)
   2          0        1       2        2

Конечный результат будет изменять нумерацию editionID по мере необходимости, чтобы сделать запись уникальной.

dateGroup areaGroup itemID editionID aGroups  (EditionID is what is altered)
   1          0        1       1        1
   1          0        1       2        1
   1          0        1       2        2    1 changed to 2 (one more than row 1)
   1          0        2       1        2
   2          0        1       1        1
   2          0        1       2        1
   2          0        1       2        2    1 changed to 2 (one more than row 1)
   2          0        1       2        2

   1          1        1       1
   1          1        1       2
   1          2        1       2             1 changed to 2 (editionID) to match
   1          2        2       1

   2          1        1       1
   2          1        1       2
   2          2        1       2             1 changed to 2 to match above
   2          2        1       2

Я знаю, что вы могли бы вычислитьeditionID вроде ранга строки примерно так:

select row_number() over ( 
       partition by dateGroup, itemID 
       order by dateGroup, itemID) as editionID

Так что все, что мне нужно, это знать, как дублировать записи из одного набора

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

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

В MySQL я бы использовал user @variables; не уверен насчет MS SQL.

2 голосов
/ 17 декабря 2010

сделать перекрестное соединение на производной таблице: (выберите 1 в качестве объединения всех групп 2)

1 голос
/ 17 декабря 2010

Вы пробовали UNION ALL вместо UNION

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

Если проблема в том, что вы хотите сделать row_number над объединением, почему бы вам не сделать что-то вроде

select row_number() over ( 
       partition by dateGroup, itemID 
       order by dateGroup, itemID) as editionID
FROM
(

         SELECT 

              dateGroup, itemID
          FROM TableA
          UNION ALL 
         SELECT 

              dateGroup, itemID
          FROM TableB 
) Data
...