从查询中消除每个符号的前14个

时间:2016-04-23 20:31:38

标签: mysql

以下查询提取relative_strength_index表中不存在的所有行。但我还需要根据historical_data表中的日期asc消除每个符号的前14行。我已经尝试了几次尝试这样做但是在14天内遇到了真正的麻烦。如何解决此问题并将其添加到我当前的查询中?

当前查询

select *
from historical_data hd
where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date);

3 个答案:

答案 0 :(得分:0)

你想要的是限制条款的第一个参数。其中哪一行表示从asc开始的顺序开始。

select * from historical_data hd where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date ORDER BY rsi_date ASC LIMIT 14)

答案 1 :(得分:0)

像这样使用OFFSET和LIMIT,这将从第15行开始返回最多100,000行

SHOW COLUMNS

但是因为您正在使用限制和偏移量,您可能希望在指定限制和偏移量之前按某种顺序进行ORDER BY。

更新您提到了每个符号的 ,因此请尝试此查询,它会根据日期asc对每个符号进行排名,然后只选择排名> gt = 15的行

select *
from historical_data hd
where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date)
order by date asc
limit 100000 offset 14;

答案 2 :(得分:0)

我不清楚(对我而言)要返回的结果集,或指定是否应返回行的条件。

我们所要做的只是一个令人困惑的模糊描述,排除每个符号的“前14行”或“前14天”。

我们没有的是数据的代表性示例,或者应该返回哪些行的示例。

如果没有这个,我们无法知道我们是否理解规范的描述,而且我们没有任何东西可以测试或比较我们的结果。

所以,我们基本上只是在猜测。 (这似乎是“尝试这种”热情所提供的最受欢迎的答案。)

我可以提供某些模式的示例,这些模式可能适合您的规范,或者可能不适合。

为每个“符号”获得最早的“histdate”,并添加14天,我们可以使用内联视图。然后我们可以对`historical_data`数据进行半连接,以排除在内联视图返回日期之前具有`histdate`的行。

(这是基于'histdate`列的数据类型为DATE的假设。)

SELECT hd.*
  FROM ( SELECT d.symbol
              , MIN(d.histdate) + INTERVAL 14 DAY AS histdate
           FROM historical_data d
          GROUP BY d.symbol
       ) dd
  JOIN historical_data hd
    ON hd.symbol   = dd.symbol
   AND hd.histdate > dd.histdate
 ORDER
    BY hd.symbol
     , hd.histdate

但该查询不包含对`relative_strength_index`表的任何引用。原始查询包括NOT EXISTS谓词,其中包含`relative_strength_index`表的相关子查询。

如果目标是从该表中获取每个`rsi_symbol`的最早的`rsi_date`,然后将14天添加到该值...

SELECT hd.*
  FROM ( SELECT rsi.rsi_symbol
              , MIN(rsi.rsi_date) + INTERVAL 14 DAY AS rsi_date
           FROM relative_strength_index rsi
          GROUP BY rsi.rsi_symbol 
       ) rs
  JOIN historical_data hd
    ON hd.symbol   =  rs.rsi_symbol
    ON hd.histdate > rs.rsi_date
 ORDER
    BY hd.symbol
     , hd.histdate

如果目标是排除relative_strength_index中匹配行已存在的行,我会使用反连接模式......

SELECT hd.*
  FROM ( SELECT d.symbol
              , MIN(d.histdate) + INTERVAL 14 DAY AS histdate
           FROM historical_data d
          GROUP BY d.symbol
       ) dd
  JOIN historical_data hd
    ON hd.symbol   = dd.symbol
   AND hd.histdate > dd.histdate
  LEFT
  JOIN relative_strength_index xr
    ON xr.rsi_symbol = hd.symbol
   AND xr.rsi_date   = hd.histdate
 WHERE xr.rsi_symbol IS NULL
 ORDER
    BY hd.symbol
     , hd.histdate

这些只是示例查询模式,可能不适合您的确切规范,因为它们是猜测。

在没有更详细的规范的情况下提供其他模式的更多示例没有多大意义。