복붙노트

[SQL] T-SQL 하위 쿼리 최대 (일)과 조인

SQL

T-SQL 하위 쿼리 최대 (일)과 조인

여러 개의 테이블을 조인하기 위해 노력하고있어,하지만 테이블 중 하나는 다른 날짜와 partid에 대한 여러 기록을 가지고있다. 나는 가장 최근의 날짜가 기록을 싶어.

다음은 몇 가지 예를 들어 테이블은 다음과 같습니다 :

Table: MyParts
Partid   Partnumber   Description
1        ABC-123      Pipe
2        ABC-124      Handle
3        ABC-125      Light


Table: MyPrices
Partid   Price        PriceDate
1        $1           1/1/2005
1        $2           1/1/2007
1        $3           1/1/2009
2        $2           1/1/2005
2        $4           1/1/2006
2        $5           1/1/2008
3        $10          1/1/2008
3        $12          1/1/2009

난 그냥 내가 할 수있는 특정 부분에 대한 가장 최근의 가격을 찾기 위해 원하는 경우 :

SELECT * FROM MyPrice WHERE PriceDate = (SELECT MAX(PriceDate) 
FROM MyPrice WHERE Partid = 1)

그러나 나는 처음에 가입 할 모든 부품 단지 하나에 대한 정확한 가격을 다시 싶어. 이것은 내가 시도 것입니다 :

SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE 
MyPart.PriceDate = (SELECT MAX(PriceDate) FROM MyPrice)

그것은 전체 테이블의 가장 높은 가격 일 소요 그 결과는 잘못이다.

SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE 
MyPart.PriceDate = (SELECT MAX(PriceDate) FROM MyPrice WHERE MyPrice.Partid =   
MyParts.Partid)

그 오류가 부족합니다.

내가 원하는 결과를 얻기 위해 무엇을 할 수 있습니다.

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    Select *,
        Price = (Select top 1 Price 
                 From MyPrices 
                 where PartID = mp.PartID 
                 order by PriceDate desc
                )
    from MyParts mp
    
  2. ==============================

    2.여기에 서브 쿼리없이 할 수있는 또 다른 방법이있다. 그것의 가치는 최고의 성능을 제공하는보기 위해 두 가지 방법을 테스트하기 때문에이 방법은 종종 다른 사람을 능가 할 것이다.

    여기에 서브 쿼리없이 할 수있는 또 다른 방법이있다. 그것의 가치는 최고의 성능을 제공하는보기 위해 두 가지 방법을 테스트하기 때문에이 방법은 종종 다른 사람을 능가 할 것이다.

    SELECT
         PRT.PartID,
         PRT.PartNumber,
         PRT.Description,
         PRC1.Price,
         PRC1.PriceDate
    FROM
         MyParts PRT
    LEFT OUTER JOIN MyPrices PRC1 ON
         PRC1.PartID = PRT.PartID
    LEFT OUTER JOIN MyPrices PRC2 ON
         PRC2.PartID = PRC1.PartID AND
         PRC2.PriceDate > PRC1.PriceDate
    WHERE
         PRC2.PartID IS NULL
    

    같은 정확한 PriceDate (대부분의 다른 솔루션은 동일을 할 것입니다) 두 개의 가격이있는 경우이 복수의 결과를 줄 것이다. 또한, 나는 미래에있는 마지막 가격 날짜에 대한 계정에 아무것도 없다. 당신은 상관없이 사용하게하는 방법의 수표를 고려할 수 있습니다.

  3. ==============================

    3.

    SELECT
        MyParts.*,MyPriceDate.Price,MyPriceDate.PriceDate
        FROM MyParts
            INNER JOIN (SELECT Partid, MAX(PriceDate) AS MaxPriceDate FROM MyPrice GROUP BY Partid) dt ON MyParts.Partid = dt.Partid
            INNER JOIN MyPrice ON dt.Partid = MyPrice.Partid AND MyPrice.PriceDate=dt.MaxPriceDate
    
  4. ==============================

    4.) (2005 년 사용 ROW_NUMBER에서 :

    ) (2005 년 사용 ROW_NUMBER에서 :

    SELECT * FROM 
        ( SELECT p.*,
            ROW_NUMBER() OVER(PARTITION BY Partid ORDER BY PriceDate DESC) AS rn
        FROM MyPrice AS p ) AS t
    WHERE rn=1
    
  5. ==============================

    5.이 같은

    이 같은

    SELECT * 
    FROM MyParts 
    LEFT JOIN 
    (
    SELECT MAX(PriceDate), PartID FROM MyPrice group by PartID
    ) myprice
     ON MyParts.Partid = MyPrice.Partid 
    

    당신이 당신의 partid을 알거나 제한 할 수있는 경우는 조인 안에 넣어.

       SELECT myprice.partid, myprice.partdate, myprice2.Price, * 
        FROM MyParts 
        LEFT JOIN 
        (
        SELECT MAX(PriceDate), PartID FROM MyPrice group by PartID
        ) myprice
         ON MyParts.Partid = MyPrice.Partid 
        Inner Join MyPrice myprice2
        on myprice2.pricedate = myprice.pricedate
        and myprice2.partid = myprice.partid
    
  6. ==============================

    6.

    SELECT
        *
    FROM
        (SELECT MAX(PriceDate) AS MaxP, Partid FROM MyPrices GROUP BY Partid) MaxP 
        JOIN
        MyPrices MP On MaxP.Partid = MP.Partid AND MaxP.MaxP = MP.PriceDate
        JOIN
        MyParts P ON MP.Partid = P.Partid
    

    먼저 partid의 최신 pricedate (표준 집계)를 얻기 위해, 다음은 일부 세부 사항을 받고 다음 (집계에있을 수 없습니다) 가격을 얻기 위해 다시 가입 할 수 있습니다.

  7. ==============================

    7.가격 테이블에 가입 한 후 마지막 날에 대한 항목을 선택합니다

    가격 테이블에 가입 한 후 마지막 날에 대한 항목을 선택합니다

    select pa.partid, pa.Partnumber, max(pr.price)
    from myparts pa
    inner join myprices pr on pr.partid = pa.partid
    where pr.PriceDate = (
        select max(PriceDate) 
        from myprices 
        where partid = pa.partid
    )
    

    최대 ()는 하루에 여러 가격이있는 경우에; 난 당신이 가장 높은 하나를 표시 할 있으리라 믿고있어. 당신의 가격 테이블은 ID 열이있는 경우, 최대 (피)와 같은 단순화 할 수 있습니다 :

    select pa.partid, pa.Partnumber, pr.price
    from myparts pa
    inner join myprices pr on pr.partid = pa.partid
    where pr.priceid = (
        select max(priceid)
        from myprices 
        where partid = pa.partid
    )
    

    추신 사용 WCM의 솔루션 대신!

  8. ==============================

    8.다른 모든 답변이 작동하지만 같은 구문을 사용한다 (그리고 이해 왜 오류)

    다른 모든 답변이 작동하지만 같은 구문을 사용한다 (그리고 이해 왜 오류)

    SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE 
    MyPart.PriceDate = (SELECT MAX(MyPrice2.PriceDate) FROM MyPrice as MyPrice2 
    WHERE MyPrice2.Partid =  MyParts.Partid)
    
  9. ==============================

    9.다음 코드 예제를 시도하십시오 :

    다음 코드 예제를 시도하십시오 :

    select t1.*, t2.partprice, t2.partdate 
    from myparts t1
    join myprices t2 
    on t1.partid = t2.partid
    where partdate = 
    (select max(partdate) from myprices t3 
    where t3.partid = t2.partid group by partid)
    
  10. ==============================

    10.MySQL의 경우, 아래의 쿼리를 발견하십시오

    MySQL의 경우, 아래의 쿼리를 발견하십시오

    select * from (select PartID, max(Pricedate) max_pricedate from MyPrices group bu partid) as a 
        inner join MyParts b on
        (a.partid = b.partid and a.max_pricedate = b.pricedate)
    

    서브 쿼리 내부는, 다음 MyPrices의 모든 partyid에 대한 최대 pricedate를 가져옵니다 이너 partid 및 max_pricedate를 사용하여 접합 MyParts

  11. from https://stackoverflow.com/questions/879111/t-sql-subquery-maxdate-and-joins by cc-by-sa and MIT license