例如表结构是:
with as ashareeodprice as
(select '1234567' as wind_code,'20160806' as trade_date,1.1 as s_dq_pctchange from dual union all
select '1234567' as wind_code,'20160807' as trade_date,-1.2 as s_dq_pctchange from dual union all
select '1234567' as wind_code,'20160808' as trade_date,-1.3 as s_dq_pctchange from dual union all
select '1234567' as wind_code,'20160810' as trade_date,-1.1 as s_dq_pctchange from dual union all
select '1234567' as wind_code,'20160811' as trade_date,-1.1 as s_dq_pctchange from dual union all
select '444' as wind_code,'20160806' as trade_date,1.1 as s_dq_pctchange from dual union all
select '444' as wind_code,'20160807' as trade_date,-1.1 as s_dq_pctchange from dual union all
select '444' as wind_code,'20160808' as trade_date,-1.1 as s_dq_pctchange from dual
)
select * from ashareeodprice
假如我想查询连续上涨或下跌三天或以上的数据 则查出windcode = 1234567的数据,并知道他是涨还是跌,连续次数。如果我想查询连续上涨或下跌2天或以上的数据,则查出两条数据。类似
--Sql Server脚本
;WITH ashareeodprice as
(
select '1234567' as wind_code,'20160806' as trade_date,1.1 as s_dq_pctchange union all
select '1234567' as wind_code,'20160807' as trade_date,-1.2 as s_dq_pctchange union all
select '1234567' as wind_code,'20160808' as trade_date,-1.3 as s_dq_pctchange union all
select '1234567' as wind_code,'20160810' as trade_date,-1.1 as s_dq_pctchange union all
select '1234567' as wind_code,'20160811' as trade_date,-1.1 as s_dq_pctchange union ALL
select '1234567' as wind_code,'20160812' as trade_date,1.1 as s_dq_pctchange union all
select '444' as wind_code,'20160806' as trade_date,1.1 as s_dq_pctchange union all
select '444' as wind_code,'20160807' as trade_date,-1.1 as s_dq_pctchange union all
select '444' as wind_code,'20160808' as trade_date,-1.1 as s_dq_pctchange
),cte AS (
SELECT *,
CASE WHEN s_dq_pctchange>0 THEN 1 ELSE 0 END AS col --通过s_dq_pctchange正负数得到一个0/1的标识列
FROM ashareeodprice
),cte2 AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY wind_code ORDER BY trade_date) AS rn, --根据wind_code分组,trade_date排序得到一个rn排序列
ROW_NUMBER() OVER(PARTITION BY wind_code,col ORDER BY trade_date) AS rn2, --根据wind_code,col标识列分组,trade_date排序得到一个rn2排序列
ROW_NUMBER() OVER(PARTITION BY wind_code ORDER BY trade_date) - ROW_NUMBER() OVER(PARTITION BY wind_code,col ORDER BY trade_date) AS cnt --以上两列相减的结果列
FROM cte
),cte3 AS (
SELECT wind_code,
cnt,
CASE col WHEN 0 THEN '下跌' WHEN 1 THEN '上涨' END [上涨/下跌],
COUNT(cnt) [连续天数]
FROM cte2
GROUP BY wind_code,cnt,col --按wind_code,cnt,col分组
HAVING count(cnt)>=2 --连续的天数【你的条件】
)
SELECT wind_code,[上涨/下跌],[连续天数]
FROM cte3;
wind_code 上涨/下跌 连续天数
--------- ----- -----------
1234567 下跌 4
444 下跌 2
如果你的上涨/下跌是通过正负数来判断的话,上面的脚本和思路你可以参考下。是sql server的脚本,不是Oracle的。Oracle上应该直接运行不了的。
先group by 然后加having ?? 能满足你吗
不太清楚你的需求。
不会Oracle,sql就不写了,反之什么关系型数据库思路都一样
查询连续涨思路是这样的:
表A:
(
查询全部数据和行号根据股票编码和日期排序 -表TBA
查询全部数据和行号根据股票编码和每股价格排序 -表TBB
其中日期排序和每股价格排序排序方向相同,相反的话是查连续跌用的
两表join TBA.行号=TBB.行号
生成一个列:equals
如果 TBA.日期=TBB.日期 and TBA.价格=TBB.价格 equals=0 反之为1
)
查询上面的表A,根据股票编码分组,查询sum(equals) 如果为0就是连续涨
连续跌思路相同
set @day=7;
set @lastDate=CURRENT_DATE();
set @startDate=DATE_SUB(@lastDate,interval @day day);
select @day,@startDate,@lastDate;
select wind_code from ashareeodprice
where s_dq_pctchange>0 and trade_date>=@lastDate and trade_date<=@startDate
GROUP BY wind_code
HAVING COUNT(0)=@day