Выявление несоответствия данных в Tuple-подобной таблице - PullRequest
1 голос
/ 05 июля 2011

У меня есть таблица, которая содержит статус доступности для работников. Вот структура:

CREATE TABLE [dbo].[Availability]
(
    [OID]                  BIGINT        IDENTITY (1, 1) NOT NULL,
    [LocumID]              BIGINT        NOT NULL,
    [AvailableDate]        SMALLDATETIME NOT NULL,
    [AvailabilityStatusID] INT           NOT NULL,
    [LastModifiedAt]       TIMESTAMP     NOT NULL,
    CONSTRAINT [PK_Availability] PRIMARY KEY CLUSTERED ([OID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];

А вот и результат:

OID                  LocumID              AvailableDate           AvailabilityStatusID LastModifiedAt
-------------------- -------------------- ----------------------- -------------------- ------------------
1                    1                    2009-03-02 00:00:00     1                    0x0000000000201A8C
2                    2                    2009-03-04 00:00:00     1                    0x0000000000201A8D
3                    1                    2009-03-05 00:00:00     1                    0x0000000000201A8E
4                    1                    2009-03-06 00:00:00     1                    0x0000000000201A8F
5                    2                    2009-03-07 00:00:00     1                    0x0000000000201A90
6                    7                    2009-03-09 00:00:00     1                    0x0000000000201A91
7                    1                    2009-03-11 00:00:00     1                    0x0000000000201A92
8                    1                    2009-03-12 00:00:00     2                    0x0000000000201A93
9                    1                    2009-03-14 00:00:00     1                    0x0000000000201A94
10                   1                    2009-03-16 00:00:00     1                    0x0000000000201A95

Теперь в таблице более 3 миллионов записей, и я заметил, что в моих данных есть несоответствия. Мне нужно как-то найти строки, где для любого [AvailableDate], [LocumID] (независимо от того, сколько) должно быть уникальным. Так что, по сути, работник может иметь один из этих [AvailabilityStatusID] = 1, 2, 3, or 4 в один день. Однако в этой таблице есть ошибки, когда работник вводится дважды или более против [AvailableDate] с тем же [AvailabilityStatusID] или другим [AvailabilityStatusID]

Как я могу обнаружить эти записи?

Привет.

1 Ответ

2 голосов
/ 05 июля 2011
WITH x AS 
(
  SELECT LocumID, dt = AvailableDate
     FROM dbo.Availability
     GROUP BY LocumID, AvailableDate 
     HAVING COUNT(*) > 1
)
SELECT a.OID, a.LocumID, a.AvailableDate, 
    a.AvailabilityStatusID, a.LastModifiedAt
 FROM x
 INNER JOIN dbo.Availability AS a
 ON x.LocumID = a.LocumID
 AND x.dt = a.AvailableDate
 ORDER BY a.LocumID, a.AvailableDate;

После того, как вы очистите эти данные (не знаете, какое правило будет в отношении того, какие строки хранить), вы должны учитывать уникальное ограничение (LocumID, AvailableDate).Вот как вы можете создать ограничение (хотя вы не сможете создать его, пока не удалите дубликаты):

ALTER TABLE dbo.Availability 
    ADD CONSTRAINT uq_l_ad 
    UNIQUE (LocumID, AvailableDate);

Конечно, теперь у вас будут новые ошибки, возвращаемые в ваше приложение (Msg 2627), поскольку ваш текущий код явно еще не проверяет, существует ли комбинация LocumID / AvailabilityDate, прежде чем добавлять новую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...