2017-10-10 9 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 

、これは私が持っているしたいものです。

TIME   MAXVERSION 
13-12-31   2 
14-12-31   3 
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 
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

具体的な質問から戻って、「分析関数」と「総計関数」について少しお読みください。あなたは明らかに2つの間で混乱しています。非常に明確に2つの違いを理解するまで、良いコードを書くことはできません。 – mathguy

+0

あなたはリジッドです。私は2つの時間の差分を取る。 – 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の比較を行うべきですか?WHATを使用しますか? – 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

は、いくつか考慮して、あなたがして、グループを探している製品、この素敵なサービスのクエリにsqlfiddle

を試して、それを使用する方法を学ぶために this、または他の例 hereで見てください。
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

関連する問題