SQL: запрос на возврат неточной записи данных - PullRequest
1 голос
/ 08 февраля 2010

Моя компания должна написать запрос, который определяет, когда данные вводятся неточно. У нас есть таблица в нашей базе данных под названием «ProductChanges». Это выглядит (как-то так) -

Product    User     ChangeDate         OldValue     NewValue
2344       John     24/01/10 10:00         2344         4324
6435       Greg     28/01/10 13:30          543         6435
6532       Tony     29/01/10 09:45       <NULL>          234

Если OldValue равно <NULL>, это означает, что это новая запись о продукте. Мы ожидаем, что в течение первого часа после создания записи произойдет ряд изменений, поскольку все данные будут обновлены. Но любые изменения после этого, как считается, означают, что первоначальная запись была неточно записана.

ТАК ... я пытаюсь придумать запрос, который возвращает все записи о продуктах, созданные за последний месяц, и любые последующие изменения записываются через час после создания первоначальной записи. Для вывода нам нужна начальная запись плюс все последующие изменения. Например. -

Product    User     ChangeDate         OldValue     NewValue
6532       Tony     29/01/10 09:45       <NULL>          234
6532       Fred     01/02/10 11:37          234         4324

Заранее спасибо!

Обновление : мы работаем с этой базой данных на SQL Server 2000

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

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

SELECT pc.Product, pc.User, pc.ChangeDate, pc.OldValue, pc.NewValue
FROM
(
    SELECT Product, ChangeDate AS EntryDate
    FROM ProductChanges
    WHERE OldValue IS NULL
) e
INNER JOIN ProductChanges pc
    ON pc.Product = e.Product
WHERE EXISTS
(
    SELECT 1
    FROM ProductChanges
    WHERE Product = e.Product
    AND ChangeDate > DATEADD(HOUR, 1, e.EntryDate)
)
AND e.EntryDate >= @BeginDate
AND e.EntryDate <= @EndDate

Нам нужно только второе объединение, потому что вы упоминаете, что хотите всю историю для всех «проблемных» наборов; если вам просто нужны идентификаторы, вы можете сделать этот запрос более эффективным, исключив среднее соединение и просто выбрав e.Product.

0 голосов
/ 08 февраля 2010
select * from pc where product in (select distinct a.product from pc a, pc b
where a.product = b.product and a.changedate > dateadd(hh, 1, b.changedate))
order by product, changedate
...