2016-09-29 6 views
0

以下のコードは2つのテーブルを結合し、複数のアカウントと履歴レコードを保持していますが、アカウントごとに最新の日付のみを抽出する必要があります。私はMAX関数を使いたいと思っていましたが、この場合にどのように組み込むのかはわかりません。私は自分のSQLサーバーを使用しています。データをフィルタリングするSQLクエリのMAX関数の使用

ありがとうございました!

select 
    PROP.FileName,PROP.InsName, PROP.Status, 
    PROP.FileTime, PROP.SubmissionNo, PROP.PolNo, 
    PROP.EffDate,PROP.ExpDate, PROP.Region, 
    PROP.Underwriter, PROP_DATA.Data , PROP_DATA.Label 
from 
    Property.dbo.PROP 
inner join 
    Property.dbo.PROP_DATA on Property.dbo.PROP.FileID = Actuarial.dbo.PROP_DATA.FileID 
where 
    (PROP_DATA.Label in ('Occupancy' , 'OccupancyTIV')) 
    and (PROP.EffDate >= '42278' and PROP.EffDate <= '42643') 
    and (PROP.Status = 'Bound') 
    and (Prop.FileTime = Max(Prop.FileTime)) 
order by 
    PROP.EffDate DESC 
+0

[SQL Serverの最新の日付のみを選択](http://stackoverflow.com/questions/35442758/sql-server-only-select-latest-date) – Paparazzi

+4

@Shasti SQLは言語であり、製品。どのDBMSを使用していますか(Oracle、PostgreSQL、SQLite、DB2、...)? –

+1

@パパラッチ:質問の唯一のタグは "sql"なので、SQL Serverであると推測することはできません。それでは、Microsoft SQL Server、Sybase SQL Server、Sybase SQL Anywhere、Sybase Adaptive Server Enterprise? – Craig

答えて

1

をテストしていない、あなたはmaxよりも小さい、またはトップよりも小さい値のn最大を排除するために、あなたのwhere句でサブクエリで自己結合を使用することができ、かつそうです。 <= 1の数値を、グループごとに必要な上限値の数に設定するだけです。次のような

何かが、たとえば、トリックを行う可能性があります:

select 
    p.FileName 
    , p.InsName 
    , p.Status 
    , p.FileTime 
    , p.SubmissionNo 
    , p.PolNo 
    , p.EffDate 
    , p.ExpDate 
    , p.Region 
    , p.Underwriter 
    , pd.Data 
    , pd.Label 
from Actuarial.dbo.PROP p 
inner join Actuarial.dbo.PROP_DATA pd 
    on p.FileID = pd.FileID 
where (
    select count(*) 
    from Actuarial.dbo.PROP p2 
    where p2.FileID = p.FileID 
    and p2.EffDate <= p.EffDate 
    ) <= 1 
and (
    pd.Label in ('Occupancy' , 'OccupancyTIV') 
    and p.Status = 'Bound' 
) 
ORDER BY p.EffDate DESC 

は完全な作業例についてthis stackoverflow questionを見てください。

+0

CTEおよびウィンドウ関数は標準SQLであり、ベンダー固有ではありません。あなたはそれらを気に入ってもいいかもしれません;) –

+0

ベンダー固有の意味では、普遍的にサポートされているわけでもなく、すべてのベンダーで同じように実装されているわけでもありません。 MSSQLは唯一のデータベースではありません。まさに過去のSybase SQL AnywhereやASEのMySQLなどの共通テーブル表現はサポートされていません。したがって、これらのツールを使用している場合、CTEは無用です。また、必ずしもサポートされている場所でパフォーマンスが向上するとは限りません。 – Craig

+0

MySQLには巨大なユーザベースがあり、OPはどのサーバがここに含まれているかを指定していないので、CTEソリューションがうまく動作するかどうかを知る方法はありません。私は、MySQL v5と他のデータベース**とCTEをサポートしていないレポートツール**のバージョンを使用する以外は選択肢のない人を直接認識しています。そして、私がここに示したSQLは、うまく機能し、CTEベースのソリューションを上回る可能性があります。私はCTEに道徳的な目的を持っていませんが、ここで働くという十分な証拠はありません。 – Craig

2

あなたのDBMSは、ウィンドウ関数とwith句をサポートし、max窓関数がうまくいくと仮定:

with all_data as (
    select 
    PROP.FileName,PROP.InsName, PROP.Status, 
    PROP.FileTime, PROP.SubmissionNo, PROP.PolNo, 
    PROP.EffDate,PROP.ExpDate, PROP.Region, 
    PROP.Underwriter, PROP_DATA.Data , PROP_DATA.Label, 
    max (PROP.EffDate) over (partition by PROP.PolNo) as max_date 

    from Actuarial.dbo.PROP 
     inner join Actuarial.dbo.PROP_DATA 
     on Actuarial.dbo.PROP.FileID = Actuarial.dbo.PROP_DATA.FileID 
    where (PROP_DATA.Label in ('Occupancy' , 'OccupancyTIV')) 
     and (PROP.EffDate >= '42278' and PROP.EffDate <= '42643') 
     and (PROP.Status = 'Bound') 
     and (Prop.FileTime = Max(Prop.FileTime)) 
) 
select 
    FileName, InsName, Status, FileTime, SubmissionNo, 
    PolNo, EffDate, ExpDate, Region, UnderWriter, Data, Label 
from all_data 
where EffDate = max_date 
ORDER BY EffDate DESC 

これはまた、任意のアカウントが同じEffDate上の2つのレコードを持っていないよりも、前提としています。その場合、最新のアカウントを決定する他の客観的手段はありません。同調の場合には、row_numerを使用して多少の任意のレコードを選択することもできます。

+0

良い点...彼は「アカウント」と言って、どの分野がアカウントを構成しているかについて私は最高の推測をしました。 – Hambone

+0

また、 'と(Prop.FileTime = Max(Prop.FileTime))'を削除する必要があります。これはおそらく、クエリの書き込みに失敗したためです。 –

-2

ストレートSQLを使用して

with temp1 as 
(
select foo 
from bar 
whre xy = MAX(xy) 
) 
       select PROP.FileName,PROP.InsName, PROP.Status, 
       PROP.FileTime, PROP.SubmissionNo, PROP.PolNo, 
       PROP.EffDate,PROP.ExpDate, PROP.Region, 
       PROP.Underwriter, PROP_DATA.Data , PROP_DATA.Label 

       from Actuarial.dbo.PROP 
        inner join temp1 t 
        on Actuarial.dbo.PROP.FileID = t.dbo.PROP_DATA.FileID 

        ORDER BY PROP.EffDate DESC 
関連する問題