Sql server 2012 SQL Server 2012中的滚动期间排名
我有一个表't',列'Date','Ticker','Price','Value'Sql server 2012 SQL Server 2012中的滚动期间排名,sql-server-2012,rank,percentile,Sql Server 2012,Rank,Percentile,我有一个表't',列'Date','Ticker','Price','Value' declare @t table ( Date date , Ticker varchar(10) , price decimal(10, 2) , value decimal (10 ,2) ) insert into @t values ('20130101', 'ABC', '100.00', '55000') ,('20130102', 'ABC', '101.5
declare @t table (
Date date
, Ticker varchar(10)
, price decimal(10, 2)
, value decimal (10 ,2)
)
insert into @t values
('20130101', 'ABC', '100.00', '55000')
,('20130102', 'ABC', '101.50', '40600')
,('20130103', 'ABC', '99.80', '109780' )
,('20130104', 'ABC', '95.50', '68760' )
,('20130105', 'ABC', '78.00', '58500')
,('20130101', 'JKL', '34.57', '34570')
,('20130102', 'JKL', '33.99', '54384')
,('20130103', 'JKL', '31.85', '12740')
,('20130104', 'JKL', '30.11', '63231')
,('20130105', 'JKL', '35.00', '59500')
,('20130101', 'XYZ', '11.50', '34500')
,('20130102', 'XYZ', '12.10', '21296')
,('20130103', 'XYZ', '17.15', '10290')
,('20130104', 'XYZ', '14.10', '32430')
,('20130105', 'XYZ', '15.55', '12129')
SELECT *,
[Value] / nullif (price,0) AS Qty
FROM @t t
我计算“数量”=“价值”/“价格”
Date Ticker price value Qty
2013-01-01 ABC 100.00 55000.00 550.0000000000000
2013-01-02 ABC 101.50 40600.00 400.0000000000000
2013-01-03 ABC 99.80 109780.00 1100.0000000000000
2013-01-04 ABC 95.50 68760.00 720.0000000000000
2013-01-05 ABC 78.00 58500.00 750.0000000000000
2013-01-01 JKL 34.57 34570.00 1000.0000000000000
2013-01-02 JKL 33.99 54384.00 1600.0000000000000
2013-01-03 JKL 31.85 12740.00 400.0000000000000
2013-01-04 JKL 30.11 63231.00 2100.0000000000000
2013-01-05 JKL 35.00 59500.00 1700.0000000000000
2013-01-01 XYZ 11.50 34500.00 3000.0000000000000
2013-01-02 XYZ 12.10 21296.00 1760.0000000000000
2013-01-03 XYZ 17.15 10290.00 600.0000000000000
2013-01-04 XYZ 14.10 32430.00 2300.0000000000000
2013-01-05 XYZ 15.55 12129.00 780.0000000000000
我想计算一个滚动3天的百分位数排名的数量为每个股票
尝试从Excel复制此输出:
Date Ticker price value Qty 3d_rank
01/01/13 ABC 100.00 55000 550
01/02/13 ABC 101.50 40600 400
01/03/13 ABC 99.80 109780 1100 1
01/04/13 ABC 95.50 68760 720 2
01/05/13 ABC 78.00 58500 750 2
01/01/13 JKL 34.57 34570 1000
01/02/13 JKL 33.99 54384 1600
01/03/13 JKL 31.85 12740 400 3
01/04/13 JKL 30.11 63231 2100 1
01/05/13 JKL 35.00 59500 1700 2
01/01/13 XYZ 11.50 34500 3000
01/02/13 XYZ 12.10 21296 1760
01/03/13 XYZ 17.15 10290 600 3
01/04/13 XYZ 14.10 32430 2300 1
01/05/13 XYZ 15.55 12129 780 2
我是否使用秩,百分比秩 (我编辑了之前的答案-CTE现在是程序的一部分。)
然后您只需使用函数:
--using function with input parameters
SELECT * FROM fRollingRank ('2013-01-01', 2)
ORDER BY Ticker, DateCol;
这一部分仍然有效:
此外-尽量避免使用保留字(如日期或值)命名列,或使用以数字开头的名称。我希望将3天排名改为其他时段排名。我如何循环日期以获取连续三天的排名?@Coding_Newbie我已经编辑了我的答案,现在你可以通过输入开始日期和时段持续时间来获得所需的输出。我希望我明白了你问题的重点。@Stanislaw,函数正在处理,但当我使用函数时,我得到错误消息:无效对象名“t”@Coding\u Newbie,这是因为t是我测试表的名称。您使用了一个变量@t。我在代码中添加了一条注释-您需要用源对象的名称替换t。
--using function with input parameters
SELECT * FROM fRollingRank ('2013-01-01', 2)
ORDER BY Ticker, DateCol;