2014-12-22 3 views
0
SELECT formid, avals(data) as datavalues, akeys(data) as datakeys, taskid 
     FROM task_form_data 
     WHERE taskid IN (449750,449699,449620) 
     ORDER BY formid, timestamp DESC 

테스트 쿼리가 될 수 있습니까?중복되지 않고 행을 SELECT하는 행을 선택하십시오.

그래서 내가 그것을 선택하면 오래된 데이터도 얻을 수 있습니다. DISTINCT ON (formid)을 사용할 수 없습니다. 필자는 최신 결과 (종종 diff formid로 3 ~ 4 행)가 필요합니다. - 각각의 taskid IN (PHP에서 유래 - 다수 일 수 있음 - 각각에 대해 별도의 질의를 할 수 없음)에 대해. 그런 식으로 작동시킬 수있는 방법이 있습니까?

데이터 예 (그냥 빨리 예 - 큰 날짜 값은 가장 오래된 타임 스탬프를 것) :

formid timestamp taskid 
6  1   449750 
2  2   449750 
2  3   449750 
4  4   449750 
4  5   449750 

무엇 나올한다 (다양한 formid-의 수는 더 크거나 작을 수) :

6  1   449750 
2  2   449750 
4  4   449750 

업데이트 : - 작동하는 것 같다 -

SELECT DISTINCT ON(formid) formid, avals(data) as datavalues, akeys(data) as datakeys, taskid, timestamp 
     FROM task_form_data 
     WHERE taskid IN (450567,449699,449620) 
     GROUP BY formid,taskid,data,timestamp 
     ORDER BY formid,timestamp DESC 

나는 것을 시도했지만 첫 번째 paramet와 어딘가에서 taskid IN. 배열의 각 값에 대해 작동하도록 수정 될 수 있습니까?

+0

마지막으로 쿼리를 실행 한 시간을 기록한 다음'where ... and timestamp> $ time_of_last_query'를 사용합니까? –

+0

늦게 회신 - 조금만 인터넷에 접속할 수 없었습니다. 문제는 다양한 persoons (고유 ID)에 대한 데이터가 있다는 것입니다. 즉, formid를 재사용 할 수 있지만 데이터가 다릅니다. –

+0

이 테이블에 하나의 식별 컬럼 또는 작성 날짜 컬럼을 작성할 수 없습니까? 최신 컬럼 식별을위한 컬럼이 있어야하기 때.입니다. Row_number() 이상 (NewIdentityColumn desc에 의해 formid, taskid 순서로 파티션) – KumarHarsh

답변

1

row_number()으로이를 수행 할 수 있습니다. 테이블이 큰없는 경우 작동 할 수

SELECT formid, avals(data) as datavalues, akeys(data) as datakeys, taskid 
FROM (SELECT d.*, row_number() over (partition by formid, taskid order by timestamp desc) as seqnum 
     FROM task_form_data d 
     WHERE taskid IN (449750, 449699, 449620) 
    ) d 
WHERE seqnum <= 3 
ORDER BY taskid, formid, timestamp DESC; 
+0

은 잘못된 결과를 제공 할 가능성이 높습니다. 각 taskid에는 자체 데이터가있는 formid-s가 여러 개있을 수 있습니다. 일부 데이터는 이전 데이터 일 수 있습니다. 나중에 업데이트되거나 추가 된 데이터입니다. 그렇게하면 테이블의 상위 3 가지를 선택할 수 있습니다 (중복인지 여부는 관계 없음).하지만 필요한 것은 각 taskid 당 각 formid에 대한 최신 행입니다. –

+0

@MauroTamm 타임 스탬프를 복제 할 수 있습니까? _newest_ 행을 구분할 수 없습니다. –

+0

그들은 동일하지 않을 것입니다 - 각 행은 밀리 초라도 여전히 고유 한 타임 스탬프를 가지고 있습니다. 하지만 각 그룹마다 최신 그룹이 필요합니다. id가 예를 들어 4567이면 8 행을 반환합니다. formid-s는 각각 12,14,12,14,15,23,12,14이며 타임 스탬프는 각각입니다. 내가 가장 최신의 것 (12,14,15,23) 만 필요 하겠지만, 단일 매개 변수 (taskid)가 아니라 배열이다. 그래서 배열의 각 taskid에 대해 그렇게해야 할 것이다. –

0

내가 정말 같은,하지만 :

SELECT tfm.formid, tfm.avals(data) as datavalues, tfm.akeys(data) as datakeys, tfm.taskid 
FROM task_form_data AS tfm 
INNER JOIN 
(
    SELECT formid, MAX(timestamp) 
    FROM task_form_data 
    WHERE taskid IN (449750,449699,449620) 
    GROUP BY formid 
) AS a 
ON tfm.formid = a.formid 
AND tfm.timestamp = a.timestamptimestamp 
WHERE tfm.taskid IN (449750,449699,449620) 
ORDER BY tfm.formid, timestamp DESC; 

당신이 정말이라고나요 예를 들어, 세 개의 가장 최근의 행을 원하는 경우 필드 "타임 스탬프"?

+0

나는 그것을 부르지 않았다. 내가 말했듯이, 나는 데이터베이스를 바꿀 수 없다 - 나는 기존의 데이터베이스로 작업해야한다. –

+0

그리고이 : ERROR : 열 "formid"존재하지 않는 LINE 5 : SELECT formid, MAX (타임 스탬프) –

+0

라인이 누락가 발생했습니다, 죄송합니다 : FROM –

0

원하는 출력과 일치합니다. 이 새로운 타임 스탬프가 하나 이전보다 더 있기 때문에 주문하는 데 사용되는 모든 곳에서 desc를 추가 할 필요가 실제 타임 스탬프와 SQL Fiddle

select * 
from (
    select *, 
     row_number() over(partition by taskid order by timestamp) as rn 
    from (
     select distinct on (taskid, formid) * 
     from task_form_data 
     where taskid in (449750,449699,449620) 
     order by taskid, formid, timestamp 
    ) s 
) s 
where rn <= 3 
order by taskid, timestamp 

.

+0

그것은 작동 할 것입니다 - 제가 최대 3 개만있을 것이라는 것을 알고 있다면. –

관련 문제