嗨!我有一個包含以下字段的SQL Server表:T-SQL排名帶第一,最小,最大,最後一個
DateTime DATETIME
Price FLOAT
該表具有唯一的DateTime鍵。我想編寫一個查詢,以20行塊的形式返回數據,返回每行20行的FIRST,MAX,MIN和LAST Price。
在這方面的任何幫助,將greately感激...
嗨!我有一個包含以下字段的SQL Server表:T-SQL排名帶第一,最小,最大,最後一個
DateTime DATETIME
Price FLOAT
該表具有唯一的DateTime鍵。我想編寫一個查詢,以20行塊的形式返回數據,返回每行20行的FIRST,MAX,MIN和LAST Price。
在這方面的任何幫助,將greately感激...
我相信你的第一組只包含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;
感謝您的回覆! – 2010-11-08 19:11:33
你的意思是這樣的:
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功能。下面是詳細的代碼:
20行基於什麼標準 - 日期,價格,或兩者的組合? – 2010-11-07 23:56:22
...並且以受保護的關鍵字命名的字段,即'DATETIME',這是一個糟糕的主意。 – JNK 2010-11-08 00:32:07