[英]T-SQL Ranking w/First, Min, Max, Last
嗨! 我有一個SQL Server表,其中包含以下字段:
DateTime DATETIME
Price FLOAT
該表具有唯一的DateTime鍵。 我想編寫一個查詢,該查詢以20行塊的形式返回數據,並為每20行集合返回FIRST,MAX,MIN和LAST Price。
在這方面的任何幫助將不勝感激。
我相信您的第一組只包含19行,而不是20行(因為行號從1開始,而不是0)。 這很容易解決-只需從ROW_NUMBER()中減去1。
我還在下面提供了一個替代解決方案,該解決方案可能會效率更高(因為它沒有要實現為嵌套循環的子查詢),而且可能也更易於管理。
注意:如果“價格”中的行數不能被20整除,則Sam和我的解決方案都將返回少於20個項目的組的第一,最小,最大和最后價格-該組包含最新的項目。 (最好使用不被20整除的行來測試這樣的查詢)
DECLARE @groupsize INT = 20;
WITH PricesWithRkGp(PurchaseDate,Price,RkUp,RkDn,Gp) AS (
SELECT
PurchaseDate,
Price,
-1+ROW_NUMBER() OVER (ORDER BY PurchaseDate),
-1+ROW_NUMBER() OVER (ORDER BY PurchaseDate DESC),
(-1+ROW_NUMBER() OVER (ORDER BY PurchaseDate)) / @groupsize
FROM Prices
)
SELECT
MIN(Price) AS MinPrice,
MAX(Price) AS MaxPrice,
Gp,
MAX(CASE WHEN RkUp%@groupsize = 0 THEN Price ELSE NULL END) AS FirstPrice,
MAX(CASE WHEN RkUp%@groupsize = @groupsize - 1 OR RkDn = 0 THEN Price ELSE NULL END) AS LastPrice
FROM PricesWithRkGp
GROUP BY Gp
ORDER BY Gp;
您的意思是這樣的嗎:
select
*,
(select Price from Prices where PurchaseDate = [Start]) as [First Price],
(select Price from Prices where PurchaseDate = [Finish]) as [Last Price]
from
(
select
MIN(PurchaseDate) as [Start],
MAX(PurchaseDate) as [Finish],
MIN(Price) as [Min Price],
MAX(Price) as [Max Price],
AVG(Price) as [Average Price]
from
(
select (ROW_NUMBER() OVER (ORDER BY PurchaseDate)) / 20 as [Seq], *
from Prices
) as X
group by X.Seq
) as Y
注意,我使用以下內容來生成數據:
create table Prices (
PurchaseDate DATETIME primary key,
Price FLOAT
)
go
declare @records int
declare @date datetime
declare @price float
set @records = 1000
while @records > 0
begin
set @date = GETDATE() - cast((RAND() * 10000) as int)
set @price = RAND() * 10000
if not exists(select 1 from Prices where PurchaseDate = @date)
begin
insert Prices values (@date, @price)
set @records = @records - 1
end
end
您可以使用CTE的ROW_NUMBER函數執行此操作。 這是帶有詳細信息的代碼:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.