Удалите дубликаты (от 1 до многих) или напишите подзапрос, который решает мою проблему - PullRequest
0 голосов
/ 28 сентября 2011

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

  1. Как удалить дубликаты?Group By не работает для меня, так как у меня более 10 полей в запросе выбора, и некоторые из них являются функциями.

  2. Написать подзапрос, который извлекает последние обновления в таблице обновлений длякаждая запись, которая обновляется в конкретном месяце .Присоединение к этому подзапросу решит мою проблему.

Спасибо!

Редактировать Структура таблицы, представляющая интерес

create table Records(
recordID int,
90more_fields various
)

create table Updates(
update_id int,
record_id int,
comment text,
byUser varchar(25),
datecreate datetime
)

enter image description here

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Вот один из способов.

SELECT * /*But list columns explicitly*/
FROM   Orange o
       CROSS APPLY (SELECT TOP 1 *
                    FROM   Blue b
                    WHERE  b.datecreate >= '20110901'
                           AND b.datecreate < '20111001'
                           AND o.RecordID = b.Record_ID2
                    ORDER  BY b.datecreate  DESC) b 
0 голосов
/ 28 сентября 2011

Последние обновления для каждой записи и месяца:

SELECT *
  FROM UPDATES outerUpd
 WHERE exists
 (
      -- Magic part
      SELECT 1
        FROM UPDATES innerUpd
       WHERE innerUpd.RecordId = outerUpd.RecordId
    GROUP BY RecordId
           , date_part('year', innerUpd.datecolumn)
           , date_part('month', innerUpd.datecolumn)
      HAVING max(innerUpd.datecolumn) = outerUpd.datecolumn
 )

(Работает в PostgreSQL, date_part отличается в других СУБД)

0 голосов
/ 28 сентября 2011

На основании доступной ограниченной информации ...

WITH cteLastUpdate AS (
    SELECT Record_ID2, UpdateDateTime, 
           ROW_NUMBER() OVER(PARTITION BY Record_ID2 ORDER BY UpdateDateTime DESC) AS RowNUM
        FROM BlueTable
        /* Add WHERE clause if needed to restrict date range */
)
SELECT *
    FROM cteLastUpdate lu
        INNER JOIN OrangeTable o
            ON lu.Record_ID2 = o.RecordID
    WHERE lu.RowNum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...