2017-11-21 1 views
0

는 내가 테이블 DemoTablecom_name, updated_date, demo_var 같은 일부 필드가 포함라고, 나는 내가 1000 개 개의 레코드를 가지고, 그래서 여기에 예를 들어그룹당 두 번째 마지막 레코드를 얻는 방법은 무엇입니까?

select * from DemoTable where demo_var=100; 

처럼에 쿼리. 이 1000 기록에 나는 updated_date에 따라 com_name의 마지막 업데이트 된 행을 얻을 조회 할

내 표는 내가 어디 demo_var = 100 fecth하고 싶어

id demo_var com_name updated_date 

1  100   XYZ   2017-11-10 

2  100   XYZ   2017-11-09 

3  100   ABC   2017-10-10 

4  100   ABC   2017-10-11 

5  150   AJD   2017-11-11 

처음처럼 보이는 다른 com_name은 갱신 된 것보다 마지막에 있습니다. 예를 들어

2  100   XYZ   2017-11-09 

3  100   ABC   2017-10-10 

처럼 나는이 두 개의 레코드를 가져올되고 싶어요.

+0

id 필드는 자동 증가 값은 다음 당신은 마지막으로 업데이트 기록을 원하는 ID 내림차순 제한 0,1 –

+1

에 의해 순서를 사용할 수있다하지만 결과는 그렇지 말했다 경우. –

+1

귀하의 예상 결과가 이전 updated_date와 (과) 일치하는 진술과 일치합니다 –

답변

1

는 2 개 행이 경우 너무 updated_date에 의해 행을 비교 쿼리를

select a.* 
from demo a 
where a.demo_var = 100 
and (
    select count(*) 
    from demo b 
    where b.demo_var = 100 
    and a.com_name = b.com_name 
    and case when a.updated_date = b.updated_date 
     then a.id > b.id 
     else a.updated_date < b.updated_date 
     end 
) = 1 /* here 1 is for second last , 0 for latest and so on */ 

주를 사용할 수 있습니다 그룹 초당 최신 행을 달성하기 위해 동일한 updated_date 및 com_name 다음 두 번째 최신 행을 선택하려면 id 열을 사용하고있는 id 열 자동으로 증가 기본적으로 설정되어 있다고 가정합니다

Demo

+1

고마워요. 제게 많은 도움이되었습니다. –

0

다음 쿼리는 작동합니다

select t.demo_var,t.com_name,max(t.updated_date) 
from 
    (
    select demo_var,com_name,upddated_date 
    from DemoTable 
    where demo_var=100 
    and (com_name,updated_date) not in (select com_name,max(updated_date) 
             from DemoTable 
             where demo_var=100 
             group by demo_var,com_name 
             ) 
    )t 
group by t.demo_var,t.com_name; 
+1

그래도 확장 성은 좋지 않다. – Strawberry

+0

@Strawberry 예, 알고 있습니다. 나는 더 나은 해결책을 내놓으려고 노력하고있다. 내가 생각한 한 번 여기에서 업데이트하라. –

+0

ID가 1 인 경우에만 작성했습니다. 동적 쿼리가 필요합니다. –

관련 문제