2017-10-10 2 views
0

내 문제는 단순 해 보이지만 나는 그걸 알아낼 수 없습니다. 최대 열 값을 선택하는 방법

내가 무엇을 가지고 :

TIME   MAXVERSION 
13-12-31   1 
13-12-31   2 
14-12-31   1 
14-12-31   2 
14-12-31   3 
15-12-31   1 
15-12-31   2 
15-12-31   3 
16-12-31   1 

이 내가하고 싶은 것입니다 :

select referencetid as time max(version) over (partition by referencetid order by version desc) as maxversion 
from D101200.PSD_BEFOLKNING_REFERENCE 
where to_char(referencetid, 'mm-dd') = '12-31' 
and to_char(referencetid, 'yy-mm-dd') between ('07-12-31') and ('16-12-31') 
order by referencetid; 

저를 일종의 준다 :

TIME   MAXVERSION 
13-12-31   2 
14-12-31   3 
15-12-31   3 
16-12-31   1 

나는 이것을 시도 whant 내가 원하는,하지만 완전히 :

TIME   MAXVERSION 
13-12-31   2 
13-12-31   2 
14-12-31   3 
14-12-31   3 
14-12-31   3 
15-12-31   3 
15-12-31   3 
15-12-31   3 
16-12-31   1 

이것은 올바른 버전을 제공하지만 데이터 세트의 크기가 줄어들지 않았습니다. 이는 내가 원했던 것입니다.

도움이됩니다.

+0

정확하게 이해했다면 날짜별로 집계를 원하므로 첫 번째 대답과 같이 시간별로 집계 할 수 있습니다. –

+1

특정 질문에서 물러나서 "분석 함수"와 "집계 함수"에 대해 간략히 읽으십시오. 당신은 분명히 두 사람 사이에 혼란 스럽습니다. 둘 사이의 차이점을 아주 명확하게 이해할 때까지는 좋은 코드를 작성할 수 없습니다. – mathguy

+0

당신은 힘이 있습니다. 나는이 둘 사이의 시간 차분을 보냈다. – Sisse

답변

3

GROUP BY을 찾고 계십니까?

 select Time, 
      Max(MaxVersion) as MaxVersion 
     from MyTable 
    group by Time 
    order by Time 
0
select 
referencetid as time, 
max(version)as maxversion 
from D101200.PSD_BEFOLKNING_REFERENCE 
where to_char(referencetid, 'mm-dd') = '12-31' 
and to_char(referencetid, 'yy-mm-dd') between ('07-12-31') and ('16-12-31') 
group by referencetid 
order by referencetid 

당신은 당신이 당신의 날짜 계산을 수정해야이 코드를

+1

좋은 답변과 다른 점 감사합니다. – Sisse

3

을 사용할 수 있습니다! 쿼리에는 항상 ISO 표준 YYYY-MM-DD (또는 YYYYMMDD) 형식을 사용하십시오. 문자열을 사용하여 날짜 비교를하지 마십시오.

귀하의 질문에 대한 대답은 간단 group by입니다 :

select referencetid as time, max(version) 
from D101200.PSD_BEFOLKNING_REFERENCE 
where referencetid in (date '2007-12-31', date '2008-12-31', date '2009-12-31', 
         date '2010-12-31', date '2011-12-31', date '2012-12-31', 
         date '2013-12-31', date '2014-12-31', date '2015-12-31', 
         date '2016-12-31') 
group by referencetid 
order by referencetid; 

이가 만드는 :

select referencetid as time, max(version) 
from D101200.PSD_BEFOLKNING_REFERENCE 
where to_char(referencetid, 'mm-dd') = '12-31' and 
     referencetid between date '2007-12-31' and date '2016-12-31' 
group by referencetid 
order by referencetid; 

은 명시 적으로 값을 나열 나는 당신을 제안 당신이 referencetid에 인덱스를 가지고 가정 인덱스를 사용하여 쿼리를보다 쉽게 ​​최적화 할 수 있습니다.

+0

"문자열을 사용하여 문자열 비교를 수행하지 마십시오"?그게 무슨 뜻이야? STRING 비교는 어떻게해야합니까? - 무엇을 사용합니까? – mathguy

+0

@mathguy. . . 나는 그것을 고쳤다. –

+0

글쎄, 문맥에서, 나는 날짜를 비교할 때 문자열 표현을 사용하지 말라는 의미로 사용합니다. – xQbert

1

는 것 (많은 질문이 오늘 해당 컬럼에 어떤 인덱스를 사용하는 쿼리를 방지 할 필터의 한 부분으로 날짜 열을 TO_CHAR 사용에 대한 31st December for the last N years

SELECT referencetid as time, 
     max(version) as maxversion 
FROM D101200.PSD_BEFOLKNING_REFERENCE 
WHERE referencetid IN (
     DATE '2016-12-31', 
     DATE '2015-12-31', 
     DATE '2014-12-31', 
     DATE '2013-12-31', 
     DATE '2012-12-31', 
     DATE '2011-12-31', 
     DATE '2010-12-31', 
     DATE '2009-12-31', 
     DATE '2008-12-31', 
     DATE '2007-12-31' 
     ) 
GROUP BY referencetid 
ORDER BY referencetid; 

요청 (또는 다른 기능)처럼 보인다 기능 기반 색인이 필요함).

0

으로 이미 몇 가지 고려하여, 당신은에 의해 그룹을 찾고 도자기, 많은 응답, 그것을 사용하는 방법을 배울 수 this 또는 다른 예 here에서 봐주십시오,이 멋진 서비스는 쿼리 sqlfiddle

을 시도
select 
    referencetid as Time, 
    max(version) as maxversion 

from D101200.PSD_BEFOLKNING_REFERENCE 

where to_char(referencetid, 'mm-dd') = '12-31' 
    and to_char(referencetid, 'yy-mm-dd') between ('07-12-31') and ('16-12- 
31') 
group by referencetid 
order by referencetid; 
+0

이것은 [JurgenHakanHifzi의 대답] (https://stackoverflow.com/a/46668776/1509264) – MT0

+0

의 복제본입니다. 저는 몇 분 전에 게시 한 것을 깨달았습니다. 이전에 의견을 적었습니다. –

+0

링크 주셔서 감사합니다! – Sisse

관련 문제