2016-09-29 3 views
0

아래 코드는 두 테이블을 조인하며 여러 계정과 기록 레코드를 보유하고 있지만 계정 당 최신 날짜 만 추출해야합니다. 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

@Paparazzi : 문제의 유일한 태그는 "sql"이므로 SQL Server라고 가정 할 수 없습니다. 그렇다면 Microsoft SQL Server, Sybase SQL Server, Sybase SQL Anywhere, Sybase Adaptive Server Enterprise? – Craig

답변

1

테스트, 그리고 곧. <= 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에 두 개의 레코드가없는 것입니다. 이 경우 최신 계정을 결정할 다른 객관적인 수단이없는 경우 동등한 경우 다소 임의의 레코드를 선택하기 위해 row_numer을 사용할 수도 있습니다.

+0

좋은 지적 ... "계정"이라고 말하면서 어떤 분야가 계정을 구성했는지에 관해 가장 잘 추측했다. – Hambone

+0

또한 'and (Prop.FileTime = Max (Prop.FileTime))'도 제거해야합니다. 아마도 쿼리를 작성하지 못한 것일 수 있습니다. –

-2

은, 당신이 가장 큰 상위 N보다 최대보다 작거나 작은 값을 제거하기 위해 당신의 where 절에 서브 쿼리에서 자체 조인을 사용할 수 있습니다 스트레이트 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