2014-12-19 3 views
4

SQL Server 2008 데이터베이스에서 수천 개의 테이블에 포함 된 일부 데이터를 분석하기 위해 스크립트 작업을하고 있습니다.SQL을 기반으로 여러 테이블에서 선택

간단히하기 위해 테이블은 4-8 세미 그룹의 그룹으로 나눌 수 있습니다. 준 관련성이란 동일한 항목에 대한 데이터 콜렉션이지만 실제 SQL 관계가 없음을 의미합니다. 각 테이블은 날짜 - 시간 스탬프 (datetime2 데이터 형식), 값 (특정 항목에 따라 bit, int 또는 float이 될 수 있음) 및 현재 관심이없는 다른 일부 열로 구성됩니다. 날짜 - 시간 스탬프는 몇 초 내에 15 분마다 (1 시간에) 설정됩니다. 그러나, 동시에 정확하게 기록 된 모든 데이터 ...

:

TABLE1 :

TIMESTAMP     VALUE 
2014-11-27 07:15:00.390  1 
2014-11-27 07:30:00.390  0 
2014-11-27 07:45:00.373  0 
2014-11-27 08:00:00.327  0 

TABLE2 :

TIMESTAMP     VALUE 
2014-11-19 08:00:07.880  0 
2014-11-19 08:15:06.867  0.0979999974370003 
2014-11-19 08:30:08.593  0.0979999974370003 
2014-11-19 08:45:07.397  0.0979999974370003 

TABLE3

TIMESTAMP     VALUE 
2014-11-27 07:15:00.390  0 
2014-11-27 07:30:00.390  0 
2014-11-27 07:45:00.373  1 
2014-11-27 08:00:00.327  1 

보시다시피, 모든 테이블이 동일한 분기 별 TIMESTAMP으로 시작하는 것은 아닙니다. 기본적으로, 나는 3 테이블 중 가장 오래된 TIMESTAMP으로 시작하는 매 15 분 간격으로 3 개의 테이블 각각에 대해 VALUE를 반환하는 쿼리입니다. 주어진 예를 들어, 나는 2014-11-27 07:15에 시작하고 싶을 것이다. (초를 신경 쓰지 마라. 따라서 타임 스탬프가 + 1 분 정도가 될 수 있도록해야한다.) 특정 TIMESTAMP에 대한 레코드가 없을 때 값에 NULL을 리턴하면 ok입니다. 따라서 위에 나열된 예제에 대한 쿼리는 다음과 같이 반환됩니다.

TIMESTAMP     VALUE1 VALUE2    VALUE3 
2014-11-27 07:15   1 NULL     0 
2014-11-27 07:30   0 NULL     0 
2014-11-27 07:45   0 NULL     1 
2014-11-27 08:00   0 NULL     1 
... 
2014-11-19 08:00   0   0      1 
2014-11-19 08:15   0   0.0979999974370003  0 
2014-11-19 08:30   0   0.0979999974370003  0 
2014-11-19 08:45   0   0.0979999974370003  0 

이 정보가 도움이되기를 바랍니다. 어떤 도움/포인터/지침을 주시면 감사하겠습니다.

답변

0

내가 할 것이 우선이 분에 타임 스탬프를 정상화이다. Floor a date in SQL server


다음을 : 당신은 바닥 날짜에 대한 자세한 내용은 새 열

ALTER TABLE TABLENAME ADD COLUMN NORMTIME DATETIME; 

UPDATE TABLENAME 
    SET NORMTIME = dateadd(minute,datediff(minute,0,TIMESTAMP),0) 

기존의 열

UPDATE TABLENAME 
    SET TIMESTAMP = dateadd(minute,datediff(minute,0,TIMESTAMP),0) 

또는에서 업데이트이 게시물이이 참조 할 수 단계는 모든 타임 스탬프 (정규화 된)를 볼 수있는 테이블을 만드는 것입니다. 즉, 행당 매 15 개입니다. 이 테이블을 TIME_PERIOD 테이블과 EVENT_TIME 테이블로 호출합니다. 원하는 경우 호출하십시오.

이러한 테이블 재귀 CTE, ROW_NUMBER(), 심지어 무차별 대항력을내는 데는 여러 가지 방법이 있습니다. 나는 너에게 그 부분을 맡긴다.

SELECT TP.EVENT_TIME, a.VALUE as VALUE1, b.VALUE as VALUE2, c.VALUE as VALUE3 
FROM TIME_PERIOD TP 
LEFT JOIN TABLE1 a ON a.[TIMESTAMP] = TP.EVENT_TIME 
LEFT JOIN TABLE2 b ON b.[TIMESTAMP] = TP.EVENT_TIME 
LEFT JOIN TABLE3 c ON c.[TIMESTAMP] = TP.EVENT_TIME 
WHERE COALESCE(a.[TIMESTAMP], b.[TIMESTAMP], c.[TIMESTAMP]) is not null 
ORDER BY TP.EVENT_TIME DESC 

그들이 항상 사용할 수 있도록 다른 유형 인 경우 좀 더 복잡한 얻을 수 있습니다 :


이제 문제는 조인과 같은 유효한 값에 대한 필터 왼쪽에 선택 간단하다 이 (합병만큼 좋지는 않지만 항상 효과가있을 것입니다) :

WHERE a.[TIMESTAMP] IS NOT NULL OR 
     b.[TIMESTAMP] IS NOT NULL OR 
     c.[TIMESTAMP] IS NOT NULL 
0

사용 Full Outer Join

SELECT COALESCE(a.[TIMESTAMP], b.[TIMESTAMP], c.[TIMESTAMP]) [TIMESTAMP], 
     Isnull(Max(a.VALUE), 0)        VALUE1, 
     Max(b.VALUE)           VALUE2, 
     Isnull(Max(c.VALUE), 0)        VALUE3 
FROM TABLE1 a 
     FULL OUTER JOIN TABLE2 b 
        ON CONVERT(SMALLDATETIME, a.[TIMESTAMP]) = CONVERT(SMALLDATETIME, b.[TIMESTAMP]) 
     FULL OUTER JOIN TABLE3 c 
        ON CONVERT(SMALLDATETIME, a.[TIMESTAMP]) = CONVERT(SMALLDATETIME, c.[TIMESTAMP]) 
GROUP BY COALESCE(a.[TIMESTAMP], b.[TIMESTAMP], c.[TIMESTAMP]) 
ORDER BY [TIMESTAMP] DESC 
+0

타임 스탬프는 다른 값을 가질 - 그들은 간단한 = – Hogan

+0

@Hogan 연결되지 않습니다 -이 http://sqlfiddle.com/#!3/c19840/2 여기 –

+0

코드가 실패 HTTP를 확인 : //sqlfiddle.com/#! 3/d2fb40/1 – Hogan

0

다음은 원하는대로하는 NoDisplayName의 대답을 업데이트 한 버전입니다. SQL 2012에서 작동하지만 DATETIMEFROMPARTS 함수를 일련의 다른 함수로 바꿔 동일한 결과를 얻을 수 있습니다.

;WITH 
NewT1 as (
SELECT DATETimeFROMPARTS(DATEPART(year,Timestamp) , DATEPART(month,timestamp) , datepart(day,timestamp),datepart(hour,timestamp), datepart(minute,timestamp),0,0) as TimeStamp, Value 
FROM Table1), 
NewT2 as (
SELECT DATETimeFROMPARTS(DATEPART(year,Timestamp) , DATEPART(month,timestamp) , datepart(day,timestamp),datepart(hour,timestamp), datepart(minute,timestamp),0,0) as TimeStamp, Value 
FROM Table2), 
NewT3 as (
SELECT DATETimeFROMPARTS(DATEPART(year,Timestamp) , DATEPART(month,timestamp) , datepart(day,timestamp),datepart(hour,timestamp), datepart(minute,timestamp),0,0) as TimeStamp, Value 
FROM Table3) 
SELECT COALESCE(a.[TIMESTAMP], b.[TIMESTAMP], c.[TIMESTAMP]) [TIMESTAMPs], 
     Isnull(Max(a.VALUE), 0)       VALUE1, 
     Isnull(Max(b.VALUE), 0)          VALUE2, 
     Isnull(Max(c.VALUE), 0)          VALUE3 
FROM NewT1 a 
     FULL OUTER JOIN NewT2 b 
        ON a.[TIMESTAMP] = b.[TIMESTAMP] 
     FULL OUTER JOIN TABLE3 c 
        ON a.[TIMESTAMP] = b.[TIMESTAMP] 
GROUP BY COALESCE(a.[TIMESTAMP], b.[TIMESTAMP], c.[TIMESTAMP]) 
ORDER BY [TIMESTAMPs] 
관련 문제