2014-09-02 2 views
0

좋아, 이건 화이트 보드 나 다른 것으로 그려 내지 않고 설명하기가 어렵다.하지만 여기에 간다. 최대한 명확하게하려고 노력했지만 이해가 안되면 알려 주시기 바랍니다.관련된 이벤트의 클러스터를 쿼리로 그룹화하는 SQL 쿼리

여러 원본 개체 또는 "원본"의 시계열 데이터 집합을 처리하는 MS Access 프로젝트가 있고 여러 관측 포인트 또는 "수신자"로 구성되며 시간 및 공간적 근접성을 기반으로 관심있는 이벤트를 식별합니다. 이것은 다음 필드와 관련 이벤트의 트리거 테이블을 제공합니다.

CORRELATION_ID
RECEIVER_EVENT_ID
RECEIVER_NAME
RECEIVER_START_DATETIME
RECEIVER_END_DATETIME
SOURCE_EVENT_ID
SOURCE_NAME
SOURCE_START_DATETIME
SOURCE_END_DATETIME

나는 GE 수 있기 때문에 겹치는 시간에 여러 개의 소스 및 수신기 트리거가 발생하거나 서로 가까이있는 경우 트리거의 방대한 목록이 표시되며 추가 기준에 따라 그룹화하여 트리거 목록을 수정하고 싶습니다.

원본 이벤트 사이의 최대 허용 시간 간격, MAX_SOURCE_GAP 및 수신자 이벤트 간의 최대 허용 간격 MAX_RECEIVER_GAP에 대해 2 가지 기준을 지정하고 싶습니다. GAP은 한 트리거의 시작 시간에서 다른 트리거의 종료 시간을 뺀 값으로 계산됩니다.

이벤트가이 간격 범위 내에 있으면 그룹화해야하며 결과 그룹 레코드는 가장 빠른 이벤트의 시작 시간과 최신 이벤트의 종료 시간을 저장해야합니다. RECEIVER 이벤트의 경우 RECEIVER_NAME은 동일해야합니다. (즉, 관련 RECEIVER <> SOURCE 이벤트의 목록으로 끝나기를 원하기 때문에 다른 수신기의 이벤트를 그룹으로 묶고 싶지 않습니다.) SOURCE 이벤트의 경우 동일한 수신기에서 RECEIVER_NAME 이벤트를 선택해야합니다. 다시 동일해야합니다. 또한 그룹화 된 소스 중 하나의 이름 목록을 반환하는 레코드를 원합니다. 이를 위해 Allen Browne의 ConcatRelated() 함수를 구현할 수 있다고 생각했습니다. 필요한

업데이트 제 3 기준은 그룹화 된 소스 이벤트 및 그룹화 된 수신기 이벤트, MAX_SOURCE_TO_RECEIVER_DELAY 사이의 관계를 정의합니다. 이것은 수신기가 트리거 될 수있는 소스의 시작 시간 이후 허용되는 최대 시간 지연입니다. 다른 단어 startTime_receiver - startTime_source < = MAX_SOURCE_TO_RECEIVER_DELAY. 수신기는 소스 이전에 트리거 할 수도 없으므로 startTime_receiver < startTime_source.

기본적으로 몇 단계가 필요합니다. SOURCE 이벤트를 그룹화하기위한 적어도 하나의 부속 조회. RECEIVER 이벤트를 그룹화하는 하나 이상의 하위 쿼리 그리고 나서 그들을 결합 시켜서 이렇게 할 수 있습니다.

RECEIVER_NAME
MIN-RECEIVER_START_DATETIME
MAX-MIN RECEIVER_END_DATETIME
-SOURCE_END_DATETIME
MAX-SOURCE_END_DATETIME
LIST_OF_SOURCES "SOURCE10, SOURCE 24 SOURCE 51 '와 같은
< --field는 Allen Browne's ConcatRelated() function에서 발생.

나는 방법론을 이해한다고 생각하지만, 2 개 이상의 트리거가있는 곳에서는 적절하게 그룹화하는 데 문제가 있습니다. 내가 알기에 적절한 시간 그룹화를 얻으면 나는 ConcatRelated와 함께 소스의 이름을 연결할 수있다.

--update - 나는 몇 가지 샘플 데이터를 업로드 한 SQLfiddle.comclick here for sample dataset

나는 기본적으로이 샘플 데이터 세트에 대해 다음과 같이 것을 마련하기 위해 노력하고 결과 테이블 :


RECEIVER_NAME MIN-RECEIVER_START_DATETIME MAX-RECEIVER_END_DATETIME SOURCE_LIST    MIN-SOURCE_START_DATETIME MAX-SOURCE_END_DATETIME 
RECEIVER1  2012-04-08 05:08    2012-04-08 06:22    SOURCE1,SOURCE2,SOURCE3 2012-04-08 02:10    2012-04-08 05:25 
RECEIVER2  2012-05-08 10:05    2012-04-08 14:55    SOURCE1,SOURCE2   2012-05-08 10:01    2012-05-08 13:45 
RECEIVER2  2012-06-08 06:55    2012-06-08 21:19    SOURCE2     2012-05-08 14:55    2012-05-08 16:22 

죄송합니다. 와우, 테이블에 게시 할 때 무슨 고통이 있습니까? 나는 더 좋은 길을 찾을 수 없었다.

+2

(1) 당신이 사용하고있는 데이터베이스 선택 SQL Server 또는 MS 액세스; (2) 설명에 어려움이 있으면 샘플 데이터와 원하는 결과를 보여줍니다. –

+0

sqlfiddle.com을 시작으로 샘플 데이터를 정리하는 것이 좋습니다. –

+0

논리에는 두 가지 문제가 있습니다. 두 가지 기준이 있기 때문에 여전히 중복 레코드가 생성됩니다. 두 번째 문제는 : 시작 및 종료 시간을 max_allowed_time_Gap로 그룹화하면 시작 및 종료 시간에 관계없이 모든 것이 그룹화됩니다. 예 : max_allowed_gap = 10mins : st01 : 00, et01 : 10 및 st02 : 00, et02 : 10은 함께 그룹화됩니다. 할 수있는 작업 : 수신기 및 소스 dateTimes에서 Min 및 Max 값을 얻을 수있는 (receiver_start_time) 및 (REceiver_end_time) 사이의 레코드로 조건을 줄입니다. 타임 라인별로 그룹화하면 시간당 트리거가 발생합니다. –

답변

0

내 의견에 언급 된대로 아니요 기준을 사용하여 결과를 산출했습니다. 이벤트는 RECEIVER_EVENT_ID 및 RECEIVER_EVENT_START_TIME별로 그룹화됩니다.

이 지금은 줄 것이다 (내가 receiver_event_id 항상 그러므로 내가 EVENT_ID 선택했다 RECEIVER_NAME 관련이 있지만, 당신은 또한 RECEIVER_NAME하여 자사의 최대 당신에게 그룹 수 추측) :

  1. 240 | RECEIVER1 | 2012 년 8 월 5 일 08 : 00 + 0000
  2. 241 | RECEIVER2 | 2012 년 8 월 10 일 05 : 00 + 0000
  3. 242 | RECEIVER2 | 2012 년 8 월 14 일 15 : 00 + 0000
  4. 243 | RECEIVER2 | 2012 년 8 월 6 일 06 : 55 : 00 + 0000

그러면 그룹화되는 이벤트와 관련된 최소값과 최대 값을 찾을 수 있습니다. 242 이벤트를 그룹화하려면 둘 다 그룹화하는 로직을 찾아야합니다. 이 당신에게 group_concatenation MySQL의 함수뿐만 아니라 그룹에 대한 아이디어를 제공

희망 : 여기

이벤트 및 이벤트 시작 시간을 그룹화하는 코드 인하입니다. 질문이나 빠른 해결책을 찾기 위해 정확한 SQL 문을 찾았 으면 알려주십시오. 나는 그것을 너무나보고 싶어합니다.

SQL Fiddle

MySQL은 5.5.32 스키마 설정 :

CREATE TABLE relatedEvents 
    (
    CORRELATION_ID INT auto_increment primary key, 
    RECEIVER_EVENT_ID INT, 
    RECEIVER_NAME VARCHAR(20), 
    RECEIVER_START_DATETIME DATETIME, 
    RECEIVER_END_DATETIME DATETIME, 
    SOURCE_EVENT_ID INT, 
    SOURCE_NAME VARCHAR(20), 
    SOURCE_START_DATETIME DATETIME, 
    SOURCE_END_DATETIME DATETIME 
    ); 

INSERT INTO relatedEvents 
(RECEIVER_EVENT_ID, RECEIVER_NAME, RECEIVER_START_DATETIME, 
    RECEIVER_END_DATETIME, SOURCE_EVENT_ID, SOURCE_NAME, SOURCE_START_DATETIME, SOURCE_END_DATETIME) 
VALUES 
('240', 'RECEIVER1', '2012-08-04 05:08:00', '2012-08-04 06:22', '1', 'SOURCE1', '2012-08-04 02:10', '2012-08-04 02:40'), 
('240', 'RECEIVER1', '2012-08-04 05:08:00', '2012-08-04 06:22', '2', 'SOURCE2', '2012-08-04 02:30', '2012-08-04 03:10'), 
('240', 'RECEIVER1', '2012-08-04 05:08:00', '2012-08-04 06:22', '3', 'SOURCE2', '2012-08-04 03:15', '2012-08-04 03:30'), 
('240', 'RECEIVER1', '2012-08-04 05:08:00', '2012-08-04 06:22', '4', 'SOURCE3', '2012-08-04 05:01', '2012-08-04 05:25'), 
('241', 'RECEIVER2', '2012-08-05 10:05:00', '2012-08-05 10:35', '5', 'SOURCE1', '2012-08-05 10:01', '2012-08-05 10:15'), 
('241', 'RECEIVER2', '2012-08-05 10:05:00', '2012-08-05 10:35', '6', 'SOURCE2', '2012-08-05 12:15', '2012-08-05 12:17'), 
('242', 'RECEIVER2', '2012-08-05 14:15:00', '2012-08-05 14:55', '7', 'SOURCE1', '2012-08-05 13:35', '2012-08-05 13:45'), 
('243', 'RECEIVER2', '2012-08-06 06:55:00', '2012-08-06 21:19', '8', 'SOURCE2', '2012-08-05 14:55', '2012-08-05 16:22'); 

검색어 1 :

SELECT 
    RECEIVER_EVENT_ID as EVENT_ID, 
    o_r.receiver_name as Receiver_name, 
    (select min(RECEIVER_START_DATETIME)from relatedEvents as I_R where ((I_R.RECEIVER_EVENT_ID = O_R.RECEIVER_EVENT_ID)) Group by I_R.RECEIVER_EVENT_ID)as min_r_st, 
    (select Max(RECEIVER_END_DATETIME)from relatedEvents as I_R where ((I_R.RECEIVER_EVENT_ID = O_R.RECEIVER_EVENT_ID)) Group by I_R.RECEIVER_EVENT_ID) as max_r_et, 
    (Select group_concat(DISTINCT source_name) from relatedEvents as I_R where ((I_R.RECEIVER_EVENT_ID = O_R.RECEIVER_EVENT_ID)) Group by I_R.RECEIVER_EVENT_ID) as Sources, 
    (select min(SOURCE_START_DATETIME)from relatedEvents as I_R where ((I_R.RECEIVER_EVENT_ID = O_R.RECEIVER_EVENT_ID)) Group by I_R.RECEIVER_EVENT_ID)as min_s_st, 
    (select Max(SOURCE_END_DATETIME)from relatedEvents as I_R where ((I_R.RECEIVER_EVENT_ID = O_R.RECEIVER_EVENT_ID)) Group by I_R.RECEIVER_EVENT_ID) as max_s_et, 
    count(RECEIVER_START_DATETIME) as RST 
FROM relatedEvents as O_R 
group by RECEIVER_EVENT_ID, RECEIVER_START_DATETIME 
order by RECEIVER_START_DATETIME asc 

Results :

| EVENT_ID | RECEIVER_NAME |      MIN_R_ST |      MAX_R_ET |     SOURCES |      MIN_S_ST |      MAX_S_ET | RST | 
|----------|---------------|-------------------------------|-------------------------------|-------------------------|-------------------------------|-------------------------------|-----| 
|  240 |  RECEIVER1 | August, 04 2012 05:08:00+0000 | August, 04 2012 06:22:00+0000 | SOURCE1,SOURCE2,SOURCE3 | August, 04 2012 02:10:00+0000 | August, 04 2012 05:25:00+0000 | 4 | 
|  241 |  RECEIVER2 | August, 05 2012 10:05:00+0000 | August, 05 2012 10:35:00+0000 |   SOURCE1,SOURCE2 | August, 05 2012 10:01:00+0000 | August, 05 2012 12:17:00+0000 | 2 | 
|  242 |  RECEIVER2 | August, 05 2012 14:15:00+0000 | August, 05 2012 14:55:00+0000 |     SOURCE1 | August, 05 2012 13:35:00+0000 | August, 05 2012 13:45:00+0000 | 1 | 
|  243 |  RECEIVER2 | August, 06 2012 06:55:00+0000 | August, 06 2012 21:19:00+0000 |     SOURCE2 | August, 05 2012 14:55:00+0000 | August, 05 2012 16:22:00+0000 | 1 | 
+0

감사합니다, 내가 찾고있는 결과는 그 결과 중 일부를 다르게 그룹화 할 수있는 기준을 제외하고는 비슷합니다. MAX_RECEIVER_GAP = 12 시간, MAX_SOURCE_GAP = 6 시간 및 MAX_SOURCE_TO_RECEIVER_DELAY = 18 시간 인 경우 수신기, 소스 및 소스 수신기 지연에 대한 기준이 유지되므로 event_ID 241 및 242를 그룹화합니다. – user1243468

+0

또한 MYSQL 기능이 없으므로 MS Access 내에서 작동하도록하는 방법을 찾아야 할 것입니다. 그러나 우리가 MYSQL에서 그것을 알아낼 수 있다면 나는 그것을 액세스 SQL에서 작동하도록 만들 수 있습니다. – user1243468

+0

@ user1243468 : 정확한 요구 사항을 모르겠습니다. 너는 나보다 더 많이 알 것이다. 이제 시작점이 생겼습니다. 그것을 가진 바이올린 :) 참고 : 그룹 기능은 값이 동일 할 때만 작동합니다. 그것은 당신의 논리/함수가 모든 레코드에 걸쳐 비슷한 값을 반환해야 함을 의미합니다. 오 예 액세스! 그걸로 행운을 빌어 요. –

관련 문제