Подтвердить что ты не робот

T-SQL Subquery Max (Date) и Joins

Я пытаюсь присоединиться к нескольким таблицам, но в одной из таблиц есть несколько записей для 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)

Это ошибки.

Что я могу сделать, чтобы получить нужные результаты.

4b9b3361

Ответ 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

Это даст несколько результатов, если у вас есть две цены с одним и тем же EXACT 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():

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 (стандартная совокупность), затем присоедините ее обратно, чтобы получить цены (которые не могут быть в совокупности), а затем получить детали детали.

Ответ 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
)

Макс() - это если в день есть несколько цен; Я предполагаю, что вы хотите отобразить самый высокий. Если ваша таблица цен имеет столбец идентификатора, вы можете избежать max() и упростить, например:

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
)

P.S. Вместо этого используйте 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, пожалуйста, найдите следующий запрос:

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, inner join с MyParts с использованием partid и max_pricedate