选择“高”列中的前 5 个最大记录,并从同一查询中的“低”列和按股票名称分区的同一个表中选择 5 个最小记录
Posted
技术标签:
【中文标题】选择“高”列中的前 5 个最大记录,并从同一查询中的“低”列和按股票名称分区的同一个表中选择 5 个最小记录【英文标题】:select top 5 max records in "High" column and 5 min records from "Low" Column in same query and from same table partitioned by stock name 【发布时间】:2020-04-18 18:12:54 【问题描述】:我们有 6 个月的历史数据,需要找出所有股票的每只股票的前 2 个最高高点和前 2 个最低低点是什么。以下是样本数据
Stock High Low Date prevclose ....
------------------------------------
ABB 100 75 29/12/2019 90
ABB 83 50 30/12/2019 87
ABB 73 45 30/12/2019 87
infy 1000 675 29/12/2019 900
infy 830 650 30/12/2019 810
infy 730 645 30/12/2019 788
我尝试了以下查询,但没有得到预期的结果。我需要一个结果集中的前 2 高行和前 3 分钟低的结果。我尝试了以下查询,但没有运气..
select * into SRTrend from (
--- Resistance
select * from (Select top (5) with ties 'H' as 'Resistance', RowN=Row_Number() over(partition by name order by High desc),* from Historic
order by Row_Number() over(partition by name order by High desc))B
Union all
--Support
select * from (Select top (5) with ties 'L' as 'Support', RowN=Row_Number() over(partition by name order by Low asc),* from Historic
--where name='ABB'
order by Row_Number() over(partition by name order by Low asc))C
)D
PS:我遇到的障碍是当我尝试将数据导出到另一个表时,得到非常混乱的结果,而不是获得前 2 个最大值(高)和前 3 个最小值(低),我得到的是单行。
【问题讨论】:
【参考方案1】:您可以使用rank()
,如下:
select *
from (
select
t.*,
rank() over(partition by stock order by high desc) rn_high,
rank() over(partition by stock order by low asc) rn_low
from mytable t
) t
where rn_high <= 2 or rn_low <= 3
内部查询对记录进行两次排序,在 stock
s 的组中降序 high
和升序 low
。然后外部查询过滤每只股票的前 2 名和后 3 名(包括平局)。
【讨论】:
谢谢,@GMB,它成功了,只是想知道我们可以使用子查询是否有其他替代方法。 最后一个问题,我们正在获取过去 180 天的输出,也在同一问题的同一查询中,我可以获取过去 30 天的数据..即.. 最多 30 天前 2 个高点和最低 3 个低点。 @GMB @Kiran:我不确定你到底是什么意思......你如何定义几个时期的顶部和底部?我建议为此提出一个新问题,并附上样本数据、预期结果和目的说明。 嗨@GMB,刚刚发布了另一个,跟进这个..***.com/questions/59533542/…以上是关于选择“高”列中的前 5 个最大记录,并从同一查询中的“低”列和按股票名称分区的同一个表中选择 5 个最小记录的主要内容,如果未能解决你的问题,请参考以下文章