[SQL] T-SQL 하위 쿼리 최대 (일)과 조인
SQLT-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.이 시도:
이 시도:
Select *, Price = (Select top 1 Price From MyPrices where PartID = mp.PartID order by PriceDate desc ) from MyParts mp
-
==============================
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.
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.) (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.이 같은
이 같은
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.
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.가격 테이블에 가입 한 후 마지막 날에 대한 항목을 선택합니다
가격 테이블에 가입 한 후 마지막 날에 대한 항목을 선택합니다
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.다른 모든 답변이 작동하지만 같은 구문을 사용한다 (그리고 이해 왜 오류)
다른 모든 답변이 작동하지만 같은 구문을 사용한다 (그리고 이해 왜 오류)
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.다음 코드 예제를 시도하십시오 :
다음 코드 예제를 시도하십시오 :
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.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
from https://stackoverflow.com/questions/879111/t-sql-subquery-maxdate-and-joins by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 많은 인덱스가있는 테이블에 대한 느린 대량 삽입 (0) | 2020.06.03 |
---|---|
[SQL] 그것은 여러 외국 키로 한 열을 참조 할 수 있습니까? (0) | 2020.06.03 |
[SQL] 어떻게 엔티티 프레임 워크는 문자 (N) 필드에 매핑 특정 컬럼에 대한 검색 자동 트림 값으로 구성 할 수 있습니다? (0) | 2020.06.03 |
[SQL] PostgreSQL를 9.3로 가져 오기 엑셀 데이터 (0) | 2020.06.03 |
[SQL] 하지 액세스 SqlTransaction 객체는 catch 블록에서 롤백 할 수 (0) | 2020.06.03 |