2016-09-22 1 views
1

내가 가지고있는이 다음 중 하나입니다 F, s의 특정 프로세스의 상태, 또는 P데이터베이스의 각 날짜를 얻는 방법을 최대 날짜의 데이터 지금까지

매일의 추적 데이터베이스

process_id state Day 
p1    f  23/9 
p2    f  23/9 
p3    p  23/9 
p4    s  23/9 

과의 경우를 다음 상태는, 예를 들면 변경되면 프로세스의 상태는 다음과 같이 DB 처음 4 개 항목을 포함 변경하거나 그대로 남아 있지만 새로운 엔트리가 데이터베이스에 추가 될 수있다 다음날 p2의 상태가 f에서 p으로 바뀌고 새 날짜와 새 역이있는 새 항목

#f  #s #p  Day 
2  1  1  23/9 
1  1  2  24/9 
다음과 같이 내가 매일 각 국가의 수를 얻기 위해하는 것입니다 필요

process_id state  Day 
p1    f  23/9 
p2    f  23/9 
p3    p  23/9 
p4    s  23/9 
p2    p  24/9 

을 다음과 같이 DB의 최종 엔트리 수 있도록 TUS 테이블에 P2에 추가됩니다

어떻게 변경되지 않은 프로세스

에 대한 새 날짜와 중복 항목을 보존 할 필요없이이 작업을 수행 할 수 있습니다 내가 할 경우

select count(process_id) from my_table group by state,Day 
같은

이것은 이전 날짜의 변경되지 않은 데이터와 상관없이 24/9에 변경된 데이터 만 계산합니다. 업데이트가 매일 발생하고 항목/일 수가 거의 없을 수 있으므로 새 날짜의 데이터 중복이 매우 비효율적입니다.

어떤 도움이 필요합니까?

답변

0

테이블을 수정하여 시작/종료 날짜를 지정하고 변경 사항이있을 때만 새 행을 삽입해야합니다. 예 :

process_id state  SDay  EDay 
p1    f  23/9  NULL 
p2    f  23/9  24/9 
p3    p  23/9  NULL 
p4    s  23/9  NULL 
p2    p  24/9  NULL 

23/9에서 P2가 f에서 p로 변경되었습니다. 그래서, 그것이 바뀐 날의 EDay를 넣으십시오. 그리고 새로운 행의 시작은 이전 행의 끝일과 같을 것입니다.

현재 레코드의 끝 날짜는 항상 NULL입니다. 원하는 경우 NULL 대신 미래의 날짜를 사용할 수도 있습니다. 와 같은 : 1/1/2500.

"제가해야 할 것은 모든 각 국가의 수를 얻을 수 있습니다 : 그런 식으로 언제 당신은 당신이 당신의 요구 사항의 두 번째의 경우,

SELECT * FROM my_table WHERE Date BETWEEN SDay AND EDay 

말할 수, 단지 현재의 기록을 원했다 일 "

나는 일종의 날짜 차원 테이블을 제안합니다. 예를 들면 : 당신이 할 수 그리고

Date 
23/5 
23/6 
23/7 
23/8 
24/9 
... 

:

SELECT count(process_id), state, Date 
FROM DateTable 
INNER JOIN my_table 
    ON Date BETWEEN SDay AND IFNULL(EDay, '1/1/2500') 
GROUP BY state, Date 
+1

딱! 고마워요 : D –

관련 문제