2017-12-14 2 views
2

검색 대상을 아는 데 어려움을 겪고 있으므로 제안 사항에 만족합니다. 나는 내 결과는 트랜잭션이 동일한 날짜하지만 같은 하루 중 다른 시간이다 레코드를 표시하도록 설정하려면1 일 복수 트랜잭션이있는 SQL ID

AccountID UpdatedDate 
123  11/1/2017 08:00:00:000 
123  11/1/2017 20:00:00:000 
123  11/2/2017 08:00:00:000 

456  11/1/2017 08:00:00:000 
456  11/1/2017 14:00:00:000 
456  11/1/2017 20:00:00:000 

789  11/1/2017 08:00:00:000 
789  11/2/2017 08:00:00:000 

:

나는 SQL Server의 다음과 같은 구조의 테이블이 있습니다 :

AccountID UpdatedDate 
123  11/1/2017 08:00:00:000 
123  11/1/2017 20:00:00:000 

456  11/1/2017 08:00:00:000 
456  11/1/2017 14:00:00:000 
456  11/1/2017 20:00:00:000 

나는 많은 행운이 없다. 분투하는 초보자를위한 도움은 환상적 일 것입니다. 감사합니다!

+0

안녕, 나는 모두의 입력을 주셔서 감사합니다. 나는 분명히 설명을해야한다. 이것은 단지 예제 데이터 세트입니다. 수천 개의 데이터 행이 있으며이 기준을 충족하는 행을 가져 오려고합니다. 내 예제를 삽입하는 임시 테이블이이 인스턴스에서 작동하는지 확신 할 수 없습니다. 제발 조언. –

+0

특정 요구에 맞게 구현할 수 있어야합니다. 2 개의 열이있는 경우 솔루션에서 AccountID와 UpdatedDate를 바꿔 원하는 결과를 얻을 수 있습니다. @testTable에서 선택하는 대신, 열이 저장된 테이블에서 원하는 열을 선택합니다. – Rooben

답변

1

가장 세련된 해결책은 아니지만 필요한 결과를 얻을 수 있습니다.

DECLARE @testTable TABLE (AccountID INT, UpdatedDate DATETIME) 

INSERT INTO @testTable 
VALUES ('123', '11/1/2017 08:00:00:000'), 
     ('123', '11/1/2017 20:00:00:000'), 
     ('123', '11/2/2017 08:00:00:000'), 
     ('456', '11/1/2017 08:00:00:000'), 
     ('456', '11/1/2017 14:00:00:000'), 
     ('456', '11/1/2017 20:00:00:000'), 
     ('789', '11/1/2017 08:00:00:000'), 
     ('789', '11/2/2017 08:00:00:000'); 

WITH accounts 
AS (
    SELECT rowid = ROW_NUMBER() OVER (
      PARTITION BY AccountID, cast(UpdatedDate AS DATE) ORDER BY UpdatedDate 
      ), AccountID, UpdatedDate, [day] = cast(UpdatedDate AS DATE), [time] = cast(UpdatedDate AS TIME(0)) 
    FROM @testTable 
    ) 
SELECT DISTINCT ch.AccountID, ch.UpdatedDate 
FROM (
    SELECT accounts.day, accounts.AccountID 
    FROM accounts 
    WHERE rowid > 1 
    ) c 
INNER JOIN accounts ch ON ch.day = c.day 
    AND c.AccountID = ch.AccountID 
1

샘플 데이터를 보내 주셔서 감사합니다. 더 2 CTE의 생각에 대한 네드 없습니다 :

DECLARE @testTable TABLE (AccountID INT, UpdatedDate DATETIME) 

INSERT INTO @testTable 
VALUES ('123', '11/1/2017 08:00:00:000'), 
     ('123', '11/1/2017 20:00:00:000'), 
     ('123', '11/2/2017 08:00:00:000'), 
     ('456', '11/1/2017 08:00:00:000'), 
     ('456', '11/1/2017 14:00:00:000'), 
     ('456', '11/1/2017 20:00:00:000'), 
     ('789', '11/1/2017 08:00:00:000'), 
     ('789', '11/2/2017 08:00:00:000'); 

WITH Counts AS (
    SELECT *, 
      COUNT(*) OVER (PARTITION BY AccountID, CONVERT(date,UpdatedDate)) AS C 
    FROM @testTable) 
SELECT AccountID, 
     UpdatedDate 
FROM Counts 
WHERE C > 1; 
0

DECLARE @T TABLE 
(
    AccountId INT, 
    UpdateDate DATETIME 
) 

INSERT INTO @T 
VALUES 
(123,'11/1/2017 08:00:00:000'), 
(123,'11/1/2017 20:00:00:000'), 
(123,'11/2/2017 08:00:00:000'), 
(456,'11/1/2017 08:00:00:000'), 
(456,'11/1/2017 14:00:00:000'), 
(456,'11/1/2017 20:00:00:000'), 
(789,'11/1/2017 08:00:00:000'), 
(789,'11/2/2017 08:00:00:000') 

;WITH CTE 
AS 
(
    SELECT 
     SeqNo = ROW_NUMBER() OVER(PARTITION BY AccountId,CAST(UpdateDate AS DATE) ORDER BY UpdateDate), 
     * 
     FROM @T 
) 
SELECT 
    * 
    FROM CTE C1  
    WHERE EXISTS 
     (
      SELECT 1 FROM CTE WHERE AccountId = C1.AccountId AND SeqNo > 1 AND CAST(UpdateDate AS DATE) = CAST(c1.UpdateDate AS DATE) 
     ) 
0

또 다른 옵션을 시도되는 계정 ID, 날짜 쌍의 집합을 얻고 그 집합에 대해 필터링을 사용 group byhaving을 할 수 있습니다.

DECLARE @testTable 표 (계정 ID INT, UpdatedDate DATETIME)는

INSERT INTO @testTable 
VALUES ('123', '11/1/2017 08:00:00:000'), 
     ('123', '11/1/2017 20:00:00:000'), 
     ('123', '11/2/2017 08:00:00:000'), 
     ('456', '11/1/2017 08:00:00:000'), 
     ('456', '11/1/2017 14:00:00:000'), 
     ('456', '11/1/2017 20:00:00:000'), 
     ('789', '11/1/2017 08:00:00:000'), 
     ('789', '11/2/2017 08:00:00:000'); 

WITH grouped AS (SELECT AccountID 
     , CAST(UpdatedDate AS DATE) AS UpdatedDateOnly 
    FROM @testTable 
    GROUP BY AccountID, CAST(UpdatedDate AS DATE) 
    HAVING COUNT(*) > 1) 
SELECT tt.* 
FROM @testTable tt 
INNER JOIN grouped g 
    ON g.AccountID = tt.AccountID 
    AND g.UpdatedDateOnly <= tt.UpdatedDate 
     AND tt.UpdatedDate < DATEADD(DAY, 1, g.UpdatedDateOnly);