Это может обрабатывать генерацию до 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);
Попробуйте это:
Select *,
Price = (Select top 1 Price
From MyPrices
where PartID = mp.PartID
order by PriceDate desc
)
from MyParts mp
Попробуйте присоединиться к подзапросу 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
Присоединитесь к таблице цен и выберите запись за последний день:
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!
Все остальные ответы должны работать, но с использованием того же синтаксиса (и понимания, почему ошибка)
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)
Пожалуйста, попробуйте следующий пример кода:
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)
Примерно так
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
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
Сначала вы должны получить последнюю цену для партии (стандартный агрегат), затем снова присоединить ее, чтобы получить цены (которые не могут быть агрегированы), а затем получить подробную информацию о деталях. .
В 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
Вот еще один способ сделать это без подзапросов. Этот метод часто превосходит другие, поэтому стоит протестировать оба метода, чтобы увидеть, какой из них дает лучшую производительность.
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 (большинство других решений будут делать то же самое). Кроме того, мне нечего учитывать, потому что дата последней цены в будущем. Вы можете проверить это независимо от того, какой метод вы в конечном итоге используете.