用于条件值排序的SQL
我正在尝试将列添加到此表中:用于条件值排序的SQL,sql,conditional,ms-access-2010,ranking,ranking-functions,Sql,Conditional,Ms Access 2010,Ranking,Ranking Functions,我正在尝试将列添加到此表中: CREATE TABLE #NEW_HIGH (SYMBOL char(4) not null, CLOSE_DATE date not null, CLOSE_PRICE money) INSERT INTO #NEW_HIGH VALUES ('A','01/07/2019',31.46) INSERT INTO #NEW_HIGH VALUES ('A','01/08/2019',32.5) INSERT INTO #NEW_HIGH VALUES ('A',
CREATE TABLE #NEW_HIGH (SYMBOL char(4) not null, CLOSE_DATE date not null, CLOSE_PRICE money)
INSERT INTO #NEW_HIGH VALUES ('A','01/07/2019',31.46)
INSERT INTO #NEW_HIGH VALUES ('A','01/08/2019',32.5)
INSERT INTO #NEW_HIGH VALUES ('A','01/09/2019',34.94)
INSERT INTO #NEW_HIGH VALUES ('A','01/10/2019',34.95)
INSERT INTO #NEW_HIGH VALUES ('A','01/11/2019',34.57)
INSERT INTO #NEW_HIGH VALUES ('B','01/07/2019',12.21)
INSERT INTO #NEW_HIGH VALUES ('B','01/08/2019',11.88)
INSERT INTO #NEW_HIGH VALUES ('B','01/09/2019',12.25)
INSERT INTO #NEW_HIGH VALUES ('B','01/10/2019',12.30)
INSERT INTO #NEW_HIGH VALUES ('B','01/11/2019',11.26)
INSERT INTO #NEW_HIGH VALUES ('C','01/07/2019',22.99)
INSERT INTO #NEW_HIGH VALUES ('C','01/08/2019',22.95)
INSERT INTO #NEW_HIGH VALUES ('C','01/09/2019',22.14)
INSERT INTO #NEW_HIGH VALUES ('C','01/10/2019',23.09)
INSERT INTO #NEW_HIGH VALUES ('C','01/11/2019',22.91)
…输出为:
SYMBOL CLOSE_DATE CLOSE_PRICE RANK_BY_NEW_HI
A 1/7/2019 31.46 1
A 1/8/2019 32.5 2
A 1/9/2019 34.94 3
A 1/10/2019 34.95 4
A 1/11/2019 34.57 1
B 1/7/2019 12.21 1
B 1/8/2019 11.88 1
B 1/9/2019 12.25 2
B 1/10/2019 12.3 3
B 1/11/2019 11.26 1
C 1/7/2019 22.99 1
C 1/8/2019 22.95 1
C 1/9/2019 22.14 1
C 1/10/2019 23.09 2
C 1/11/2019 22.91 1
基本上,我试图添加一个名为RANK_BY_NEW_HI的第四列,它从第1行的值1开始,在符号和日期顺序中的下一个收盘价记录较高时增加1,在它等于或低于上一个收盘价记录或新符号开始时重置为1
我花了几天的时间试图弄明白这一点,所以任何帮助都将不胜感激 这在SQL Server中要简单得多。您可以使用lag来识别峰值,使用累积和来识别结果组,然后使用行编号: 他是一把小提琴
您不是在征求我的意见,但我建议您使用SQL Server而不是MS Access进行工作。这是一个功能更强大的数据库。这在MS Access中很难做到。您还有其他可用的数据库吗?到目前为止,我已经使用SQL viewer在Access中编写了所有内容,意识到存在语法限制,但是如果您有使用SQL Server的建议,那就太好了。谢谢你的回复,戈登!太棒了…在SQL Server中工作得非常好!同意,我就把它换了。再次感谢你,戈登!
select nh.*, row_number() over (partition by symbol, high_grp order by close_date) as rank_by_new_high
from (select nh.*,
sum(case when prev_cp < close_price then 0 else 1 end) over (partition by nh.symbol order by nh.close_date) as high_grp
from (select nh.*,
lag(nh.close_price) over (partition by nh.symbol order by nh.close_date) as prev_cp
from #new_high nh
) nh
) nh
order by symbol, close_date;