여기 내 질문에 대한 답을 드리겠습니다. 일련의 타임 스탬프와 기본 키로 부품 번호가있는 테이블이 있다고 가정 해 보겠습니다. 테이블은 증 분식 변경 사항을 저장합니다. 즉, 모든 타임 스탬프에 대해 필드가 변경되면 해당 변경 사항이 기록됩니다. 필드가 변경되지 않으면 새 타임 스탬프의 경우 NULL입니다. 다음은 기본적인 아이디어입니다.데이터베이스 : null이 아닌 마지막 항목을 선택하십시오.
part | timestamp | x-pos | y-pos | status
------+-----------+-------+-------+--------
a5 | 151 | 5 | 15 | g
a5 | 153 | NULL | 17 | NULL
(part, timestamp)
이 기본 키입니다. 두 번째 레코드의 NULL
은 첫 번째 레코드 이후 변경되지 않은 값을 나타냅니다.
내가 할 수있는 일은 부품으로 그룹화 된 각 필드의 최신 값을 선택하는 것입니다. 예를 들어, 위의 항목이 주어지면 결과는 부분 a5에 대해 153,5,17, g가됩니다.
현재로서는이 해킹 된 쿼리가 있습니다.
((SELECT x-pos FROM part_changes WHERE x-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT y-pos FROM part_changesWHERE y-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT status FROM part_changes WHERE status IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1))
하지만 단일 열이 반환됩니다. 즉, 정리를 위해 그룹화를 사용할 수 있습니다.
창조적 인 방법으로 COALESCE 또는 IS NULL을 사용하는 것과 같은 더 우아한 방법이 있어야합니다. 그러나 나는 붙어있어 그것을 이해할 수 없다. 누구 아이디어있어?
아니요, 데이터베이스 구조를 변경할 수 없습니다.
편집 : ruakh가 올바른 생각을 가지고 있습니다. 유일한 문제는 이제 부분별로 그룹화됩니다. 여러 부분으로 그룹화하기 위해 LIMIT 1
주위를 돌고있는 것처럼 보일 수 없습니다. 어떤 아이디어?
mdahlman, 나는 postgresql의 분석 함수에 익숙하지 않습니다. 따라서이 솔루션이 복잡한 쿼리보다 쉬우면 아이디어를 게시하십시오.
편집 2 : 도움 주셔서 감사합니다. 나는 내가해야 할 일에 대해 충분히 이해하고 있다고 생각합니다.
분석 함수가 허용되는지 여부를 지정해야합니다. 그들과 함께 대답은 간단해야합니다. 그들 없이는 ... 힘들어 질거야. – mdahlman
거기에 얼마나 많은 null 값이 발생할 수 있습니까? 제한이 있다면 몇 가지 왼쪽 조인을 가진 해결책이 될 것입니다. 좋지는 않지만 끝낼 수 있습니다;) – rauschen
한계가 있다고 생각하지 않습니다. 사실, 필드 중 하나는 NULL (대다수) (99 %와 비슷한 것)을 NULL로 가지고 있습니다. –