이전 시스템에서 데이터를 마이그레이션 한 후 날짜가없는 레코드가있는 상황을 발견했습니다.
위에서 제시 한 예는 제가 가진 상황입니다. 그 NULL에서 데이터를 가져올 곳이 없습니다. 따라서 논리적으로 설정되는 것은 다음과 같습니다.
이것을 달성하기 위해 CASE를 작성한다고 가정합니다. 누군가가 그것을 얻는 방법을 알아내는 데 도움을 줄 수 있습니까?
이 작업을 수행하는 방법을 보여주기 위해 작은 POC를 설정했습니다.
CREATE TABLE
#T
(
c1 char(9) NOT NULL
, c2 datetime NULL
);
INSERT INTO
#T
(
c1
, c2
)
VALUES
('0011.001', '2008-12-16T00:00:00.000')
, ('0013.000', NULL)
, ('0013.001', '2008-07-10T00:00:00.000')
, ('0013.002', NULL)
, ('9999.000', '2009-07-03T00:00:00.000');
이 시점에서 3 개의 고유 한 "밴드"가있는 테이블이 있습니다.이 테이블은 해당 열에서 선행 4 자라고 부르는 것입니다. 숫자는 앞에 0이 없기 때문에 숫자가 아닙니다. 그것은 표현의 인공물입니다.
-- Identify the minimum value per first 4 digit values
SELECT
LEFT(T.c1, 4) AS Band
, MIN(T.c2) AS MinDate
FROM
#T AS T
GROUP BY
LEFT(T.c1, 4)
해당 쿼리를 실행하면 다음과 같은 결과가 제공됩니다.
Band MinDate
0011 2008-12-16 00:00:00.000
0013 2008-07-10 00:00:00.000
9999 2009-07-03 00:00:00.000
그게 제가 기대하는 것입니다. 이제이 값을 사용하여 누락 된 날짜를 채우기 만하면됩니다.
-- Use this query to backfill data
-- the join condition here makes things painful for large data sets
UPDATE
T
SET
T.c2 = D.MinDate
FROM
#T AS T
-- use the above query as a derived table
INNER JOIN
(
-- Identify the minimum value per first 4 digit values
SELECT
LEFT(T.c1, 4) AS Band
, MIN(T.c2) AS MinDate
FROM
#T AS T
GROUP BY
LEFT(T.c1, 4)
) D
ON D.Band = LEFT(T.c1, 4)
WHERE
T.c2 IS NULL;
물론 SQL Server 2005+ (요즘 일 가능성이 높음)를 사용하는 경우 창을 사용하여 조인을 사용하지 않을 수 있습니다 MIN()
.
UPDATE
T
SET
T.c2 = T.MinDate
FROM
(
SELECT
T.c2
, MIN(T.c2) OVER (PARTITION BY LEFT(T.c1, 4)) AS MinDate
FROM
#T AS T
) T
WHERE
T.c2 IS NULL;
기본적으로 위의 방법은 c2
값과 해당 최소값이 파생 된 테이블 (이 컨텍스트에서 업데이트 가능)로 사용되는 동일한 하위 쿼리에서 계산되고 반환 된다는 점을 제외하면 이전 솔루션과 동일하게 작동합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다