Sql server 2012 SQL Server 2012中的滚动期间排名

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

我有一个表'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.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;