繁体   English   中英

用于从特定组[符号]中删除特定行[时间]的SQL语法

[英]SQL syntax for removing a specific row [time] from a specific group [symbol]

我遇到了SQL查询知识的边缘,可以使用正确方向的一个点。 (我正在使用Presto,但理想情况下这应该无关紧要,因为Presto使用常见的SQL语法。)

我想做的是始终只在'VIX'符号上排除9:31:00 [QuoteTime]。 如果可能的话,我只想在[Bid]和[Ask]为0的情况下排除9:31:00 VIX [QuoteTime]行。

我已经查看了HAVING子句作为WHERE子句的替代/补充。 我没有成功将它集成到我的查询中。

为了找到9:31:00的时间,我查看了LIKE子句。 我也很关心我有效写这篇文章的能力。

我的斗争是将它们结合起来以创建正确且最有效的查询。

这是我的数据:

+---------------+--------+---------+---------+
| QuoteTime     | Symbol |   Bid   |   Ask   |
+---------------+--------+---------+---------+
| 09:31:00      | VIX    |       0 |       0 |
| 09:32:00      | VIX    |   13.24 |   13.24 |
| 09:33:00      | VIX    |   13.21 |   13.21 |
| 09:31:00      | SPX    | 2889.36 | 2894.18 |
| 09:32:00      | SPX    | 2889.15 | 2892.99 |
| 09:33:00      | SPX    | 2889.89 | 2892.71 |
| 09:31:00      | NDX    | 7616.64 | 7616.64 |
| 09:32:00      | NDX    | 7612.13 | 7612.13 |
| 09:33:00      | NDX    | 7613.32 | 7613.32 |
+---------------+--------+---------+---------+

这是我目前的查询:

SELECT QuoteTime, Symbol, ((Bid+Ask)/2) as MidPoint 
FROM schema.tablename 
WHERE (Symbol IN ('SPX', 'VIX')) 

以下是我的核选择。 我不喜欢它,因为它可能(我不知道)在其他时间删除其他符号包含0的其他行:

SELECT QuoteTime, Symbol, ((Bid+Ask)/2) as MidPoint 
FROM schema.tablename 
WHERE (Symbol IN ('SPX', 'VIX')) AND Bid != 0 AND Ask != 0

您想为符号'SPX'和'VIX'选择所有行,但不包括9:31:00 - VIX - 0 - 0.有几种方法可以表达这一点。 fa06的答案中已经显示了一种方法。

SELECT quotetime, symbol, ((bid+ask)/2) as midpoint 
FROM schema.tablename 
WHERE symbol in ('SPX', 'VIX')
AND (quotetime, symbol, bid, ask) NOT IN ((time '09:31', 'VIX', 0, 0));

(编辑:你说这对你不起作用。可能是presto还没有支持带有元组的IN子句。)

另一个是:

SELECT quotetime, symbol, ((bid+ask)/2) as midpoint 
FROM schema.tablename 
WHERE symbol IN ('SPX', 'VIX')
AND (quote_time <> time '09:31' OR symbol <> 'VIX' OR bid <> 0 OR ask <> 0);

另一个是:

SELECT quotetime, symbol, ((bid+ask)/2) as midpoint 
FROM schema.tablename 
WHERE symbol IN ('SPX', 'VIX')
AND NOT (quote_time = time '09:31' AND symbol = 'VIX' AND bid = 0 AND ask = 0);

(如果其中一列可以为null,那么您也必须在查询中考虑这一点。例如(ask <> 0 OR ask IS NULL) 。)

你可以尝试下面 -

SELECT QuoteTime, Symbol, ((Bid+Ask)/2) as MidPoint 
FROM schema.tablename 
WHERE (QuoteTime, Symbol,Bid,Ask) not in (('09:31:00','VIX',0,0))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM