'리더'객체의 상태 기록을 포함하는 간단한 테이블이 있습니다. 상태는 ACTIVE 또는 INACTIVE 일 수 있습니다. 이제는 주어진 기간 동안 활성화 된 모든 독자를 선택하는 쿼리를 원합니다. 다음 이미지는 내가 의미하는 바를 보여준다 : 녹색의 'lifeline'을 가진 '독자'는 표시된 기간에 ACTIVE였다. 그래서 그들은 질의에 반환 될 것이다. 이 (예를 들어 단지 상기 이미지와 일치하지 않음)처럼주어진 기간에 상태 기록 테이블의 활성 상태를 선택하십시오.
tabel ReaderActivity
본다 :
reader_id | state | timestamp
1 | ACTIVE | 1467331201089
2 | ACTIVE | 1467332454545
1 | INACTIVE | 1467348875254
3 | ACTIVE | 1467350416546
1 | ACTIVE | 1467351871123
2 | INACTIVE | 1467352111545
가되는이 reader_id
가 맵핑하는 Reader
엔티티있다.
이 문제에 대한 JPA 쿼리가 필요하지만 그 기간 내에 이미 '상승 에지'가없는 결과 (INACTIVE에서 ACTIVE로 상태가 변경됨)가있는 독자가 포함 된 문제가 있습니다. 우리가 조사하는 기간). 모든 상승 에지를 가진 선택
- 첫째 :
내가 너무 기본적으로 쿼리의 일부를 참조하십시오. 이것은 간단합니다.
SELECT DISTINCT a.reader FROM ReaderActivity a WHERE a.timestamp >= :startTimestamp AND a.timestamp < :endTimestamp AND a.state = 'ACTIVE'
- 둘째, 모든 독자 위에 목록에 추가해야합니다. 모든 독자는 기간 시작 전에 마지막 상태 인 ACTIVE를가집니다. 이것은 내가 제대로하지 않는 것입니다 :
SELECT DISTINCT a.reader FROM ReaderActivity a WHERE a.timestamp >= :startTimestamp AND a.timestamp < :endTimestamp AND a.state = 'ACTIVE' or (SELECT aa.reader FROM ReaderActivity aa where aa.reader = a.reader AND aa.timestamp < :startTimestamp AND aa.state = 'ACTIVE' GROUP BY aa.reader ORDER BY max(aa.timestamp)) != null
이것은 또한 반환 빨간색 하위 쿼리에서 AND aa.state = 'ACTIVE'
와 함께, 우리는 이미 필터링 때문에 위의 이미지에서 독자를 표시 : 나는 (주먹 쿼리로 결합) 시도 모든 ACTIVE 상태이므로 마지막 ACTIVE 상태가됩니다. 시작일 이전에 마지막 상태를 선택하고 이후에 활성 상태인지 확인해야합니다. 그러나 어떻게?
아무도 올바른 방법으로 나를 데려 갈 수 있습니까? 미리 감사드립니다.
고맙습니다, 루크! 나는 ...을 사용할 수있는 가능성을 놓쳤다.() ... [+1] - 나의 전체 질의는 이제 다음과 같다 :'SELECT DISTINCT a.reader From ReaderActivity a where a.timestamp> = : startTs AND a.timestamp <: endTs AND a.state = 'ACTIVE'OR (a.timestamp IN (SELECT MAX (b.timestamp) FROM ReaderActivity b WHERE b.timestamp <: startTs GROUP BY b.reader) AND a.state = 'ACTIVE') '- 한 가지 질문 : 마지막에 '국가'를 대괄호로 묶은 이유는 무엇입니까 ('... and a. [state] = ...')? – badera
중요한 힌트를 해결할 수 없습니까? *이 쿼리에주의해야 할 유일한 이유는 특정 이유로 reader_id 'a'가 밀리 초 단위로 "INACTIVE"로 설정된 경우 ... 추가하여 ... 'where b.reader_id = a.reader_id'는 하위 선택의 where 절에 있습니까? – badera
첫 번째 질문에 대한 답변으로 국가에서 대괄호를 제거해도 검색어가 변경되지 않으며 둘 중 아무 것도 입력하지 않습니다. 열이 공백으로 분리 된 단어로 구성되어있을 때 하나의 열을 그룹화하여 유지하려면 열 주위에 대괄호가 필요합니다. 웬일인지 나는 2 개의 단어로서 상태를 읽는다 (확실하지 않은 방법). 두 번째 질문에 대한 대답으로 예! a.reader_id = b.reader_id에 where 필터를 추가하면 'INACTIVE'레코드를 다시 가져올 수 없습니다. 이를 반영하도록 쿼리를 변경하겠습니다. @ 바데라 – Luke