2012-02-05 3 views
0

관계형 데이터베이스에 대한 경험이 없으며 문제를 해결하기 위해 C++ 코드를 작성하기 전에 데이터베이스를 사용하면 쉬운 솔루션을 제공하는지 확인하고 싶습니다. 여기에 내 문제가있다 :관계형 데이터베이스를 사용하여 실험 데이터의 진화를 추적하십시오

나는 실제 샘플 세트와 간단한 측정을 통해 각 샘플에 대해 실수 결과를 산출한다. 사용 가능한 모든 샘플에서 여러 번 측정이 수행되고 (새 샘플이 주기적으로 추가됨) 결과는 SAMPLE_ID 및 RESULT 열이있는 테이블로 데이터베이스에 저장됩니다. 각 측정 값은 결과가 포함 된 새 테이블로 저장됩니다 (테이블 이름은 특정 측정을 나타냄). 또는, 더 의미가있는 경우 각 측정은 현재 결과 (열 이름은 특정 측정을 나타냅니다)가있는 글로벌 테이블에 열을 추가합니다. 나는 C++ API를 통해 테이블을 만들고 보고서 (쿼리 결과)를 같은 방식으로받습니다. 최소한 두 개의 보고서가 필요합니다 (간단한 ASCII 텍스트는 정상입니다) :

  1. 최상의 결과를 얻은 모든 샘플 목록입니다.
  2. 측정의 작은 하위 집합의 경우, 가장 최근의 측정 결과가 선행 된 측정보다 (가장 낮은) 선택된 샘플 목록입니다 (선택한 하위 집합에서).

각 보고서를 생성하는 데이터베이스 쿼리는 무엇입니까?

+2

정확히 묻는 중입니다. –

+0

네가 맞다. 데이터베이스가 해결책 인 것 같다. 이제 데이터베이스를 디자인하는 분석가가 필요합니다. 사용자 프론트 엔드 인터페이스를 만드는 코드 개발자. 보고서 작성 전문가. 나는 당신이 무언가를 시험하고 질문을 나눌 수 있다고 생각합니다. 나는 투표를 닫습니다. – danihp

+0

Sample_id가 고유하지 않은 것 같습니다. 데이터 + 측정 시간이 포함 된 세 번째 열이 필요하며 두 번째 테이블도 필요합니다. – wildplasser

답변

1

예, 데이터베이스가 제대로 작동합니다.

샘플 결과를 구별 할 수 있도록 날짜 또는 시간 소인을 저장하는 열이 필요합니다. 그런 칼럼이 없다면, "가장 최근의 측정"은 의미가 없습니다. 테이블의 행 순서는 본질적으로 의미가 없습니다.

프런트 엔드를 개발할 필요가 없을 것입니다. 수동으로 데이터를 입력하거나 dbms의 대량 로더를 통해 CSV 파일을로드하십시오. (모든 최신 dbms에는 하나의 이름이 있으며 이름은 다릅니다.)

아마도 보고서 작성 전문가는 필요하지 않습니다. 쿼리 출력은 종종 연구에 필요한 모든 것입니다.

일부 검색어는 간단하고 다른 검색어는 단순하지는 않지만 간단합니다. 아래 코드는 PostgreSQL에서 테스트되었지만 공통 테이블 표현식과 행 생성자를 지원하는 dbms에서 작동해야합니다.

create table measurements (
    sample_id integer not null, 
    measurement_time timestamp not null, 
    measurement real not null check(measurement >= 0 and measurement <= 30), 
    primary key (sample_id, measurement_time) 
); 

insert into measurements values 
(1, '2012-02-02 08:03', 13.89), 
(2, '2012-02-02 00:00', 13.86), 
(1, '2012-02-02 00:25', 25.07), 
(1, '2012-02-02 03:32', 25.38), 
(1, '2012-02-02 05:47', 16.64), 
(2, '2012-02-02 08:03', 16.16), 
(2, '2012-02-02 07:25', 25.85), 
(3, '2012-02-02 08:03', 14.78), 
(3, '2012-02-02 09:29', 17.08), 
(3, '2012-02-02 10:31', 13.41), 
(4, '2012-02-02 12:38', 20.98), 
(5, '2012-02-02 08:03', 25.00), 
(5, '2012-02-02 14:02', 16.27), 
(5, '2012-02-02 03:32', 12.10), 
(5, '2012-02-02 17:47', 21.34), 
(6, '2012-02-02 18:32', 17.16), 
(6, '2012-02-02 18:33', 21.59), 
(7, '2012-02-02 20:07', 21.47), 
(8, '2012-02-02 21:58', 11.50), 
(8, '2012-02-02 22:53', 21.01); 

-- All samples with their highest measurement. 
select sample_id, max(measurement) 
from measurements 
group by sample_id 
order by sample_id; 

-- Most recent measurement lower than any preceeding measurement. 
-- Another way of saying this is that the max() measurement isn't the 
-- latest measurement. 
with max_measurements as (
    select m.* 
    from measurements m 
    inner join (select sample_id, max(measurement) measurement 
       from measurements 
       group by sample_id) max_m 
     on max_m.sample_id = m.sample_id 
    and max_m.measurement = m.measurement 
), 
latest_measurement as (
    select m.* 
    from measurements m 
    inner join (select sample_id, max(measurement_time) measurement_time 
       from measurements 
       group by sample_id) max_m 
     on max_m.sample_id = m.sample_id 
    and max_m.measurement_time = m.measurement_time 
) 
select m.* 
from max_measurements m 
where row(m.sample_id, m.measurement_time) not in (select sample_id, measurement_time 
                from latest_measurement); 
+0

고마워요! 이것은 제가 바라는 종류의 대답입니다. 나는 당신의 단일 테이블 디자인 (SAMPLE_ID, MEASUREMENT_TIME, MEASUREMENT_RESULT)을 소팅 할 때 데이터 지역성에 도움이된다. –

+0

귀하의 문제 - 우리가 알고있는 것 -은 단일 테이블 문제입니다. 그건 사실 아주 드문 일입니다. (ID 번호뿐 아니라 샘플에 대한 자세한 정보가있는 경우 두 개의 표가 있습니다.) –

관련 문제