Подзапрос T-SQL Max (дата) и соединения

Это может обрабатывать генерацию до 20-значного UNIQUE случайного числа

JS

 var generatedNumbers = [];

    function generateRandomNumber(precision) { // input --> number precision in integer 
        if (precision <= 20) {
            var randomNum = Math.round(Math.random().toFixed(precision) * Math.pow(10, precision));
            if (generatedNumbers.indexOf(randomNum) > -1) {
                if (generatedNumbers.length == Math.pow(10, precision))
                    return "Generated all values with this precision";
                    return generateRandomNumber(precision);
            } else {
                generatedNumbers.push(randomNum);
                return randomNum;
            }
        } else
           return "Number Precision shoould not exceed 20";
    }
    generateRandomNumber(1);

jsFiddle

27
задан Cade Roux 18 May 2009 в 21:38
поделиться

9 ответов

Попробуйте это:

Select *,
    Price = (Select top 1 Price 
             From MyPrices 
             where PartID = mp.PartID 
             order by PriceDate desc
            )
from MyParts mp
33
ответ дан wcm 14 October 2019 в 12:26
поделиться

Попробуйте присоединиться к подзапросу MyPrice, чтобы получить MAX(PriceDate):

SELECT a.*, MyPriceDate.Price, MyPriceDate.PriceDate
FROM MyParts a
INNER JOIN (
    SELECT Partid, MAX(PriceDate) AS MaxPriceDate 
    FROM MyPrice 
    GROUP BY Partid
) dt ON a.Partid = dt.Partid
INNER JOIN MyPrice ON dt.Partid = MyPrice.Partid 
                   AND a.PriceDate = dt.MaxPriceDate
11
ответ дан KM. 14 October 2019 в 12:26
поделиться

Присоединитесь к таблице цен и выберите запись за последний день:

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!

3
ответ дан Andomar 14 October 2019 в 12:26
поделиться

Все остальные ответы должны работать, но с использованием того же синтаксиса (и понимания, почему ошибка)

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)
2
ответ дан Eduardo Molteni 14 October 2019 в 12:26
поделиться

Пожалуйста, попробуйте следующий пример кода:

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)
1
ответ дан Pavel 14 October 2019 в 12:26
поделиться

Примерно так

SELECT * 
FROM MyParts 
LEFT JOIN 
(
SELECT MAX(PriceDate), PartID FROM MyPrice group by PartID
) myprice
 ON MyParts.Partid = MyPrice.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
5
ответ дан 28 November 2019 в 04:09
поделиться
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

Сначала вы должны получить последнюю цену для партии (стандартный агрегат), затем снова присоединить ее, чтобы получить цены (которые не могут быть агрегированы), а затем получить подробную информацию о деталях. .

3
ответ дан 28 November 2019 в 04:09
поделиться

В 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
6
ответ дан 28 November 2019 в 04:09
поделиться

Вот еще один способ сделать это без подзапросов. Этот метод часто превосходит другие, поэтому стоит протестировать оба метода, чтобы увидеть, какой из них дает лучшую производительность.

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 (большинство других решений будут делать то же самое). Кроме того, мне нечего учитывать, потому что дата последней цены в будущем. Вы можете проверить это независимо от того, какой метод вы в конечном итоге используете.

33
ответ дан 28 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: