选择“高”列中的前 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

内部查询对记录进行两次排序,在 stocks 的组中降序 high 和升序 low。然后外部查询过滤每只股票的前 2 名和后 3 名(包括平局)。

【讨论】:

谢谢,@GMB,它成功了,只是想知道我们可以使用子查询是否有其他替代方法。 最后一个问题,我们正在获取过去 180 天的输出,也在同一问题的同一查询中,我可以获取过去 30 天的数据..即.. 最多 30 天前 2 个高点和最低 3 个低点。 @GMB @Kiran:我不确定你到底是什么意思......你如何定义几个时期的顶部和底部?我建议为此提出一个新问题,并附上样本数据、预期结果和目的说明。 嗨@GMB,刚刚发布了另一个,跟进这个..***.com/questions/59533542/…

以上是关于选择“高”列中的前 5 个最大记录,并从同一查询中的“低”列和按股票名称分区的同一个表中选择 5 个最小记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 CodeIgniter 查询从同一列中选择多条记录

在一个查询中返回多个组中的前“X”条记录

hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组

python中一列中的前三个最大值

MYSQL - 1列中的多个所有数据在同一列中具有最大值

仅显示选择 SQL 中的前 5 个字符?