Синтаксис SQL для удаления определенной строки [время] из определенной группы [символ]

#sql #presto

#sql #presto

Вопрос:

Я сталкиваюсь с краем своих знаний о SQL-запросах и мог бы использовать точку в правильном направлении. (Я использую Presto, но в идеале это не должно иметь значения, потому что Presto использует общий синтаксис SQL.)

Что я хотел бы сделать, так это всегда исключать 9:31:00 [QuoteTime] ТОЛЬКО для символа ‘VIX’. Если возможно, я хотел бы исключить строку VIX [QuoteTime] 9:31:00 только в том случае, если [Bid] И [Ask] равны 0.

Я рассмотрел предложение HAVING в качестве альтернативы / дополнения к предложению WHERE . Мне не удалось интегрировать это в мой запрос.

Я просмотрел предложение LIKE, пытаясь найти время 9:31:00. Я также обеспокоен своей способностью писать это эффективно.

Моя задача — объединить их, чтобы создать правильный и наиболее эффективный запрос.

Вот мои данные:

  --------------- -------- --------- --------- 
| 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
  

Ответ №1:

Вы хотите выбрать все строки для символов ‘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);
  

(Если один из столбцов может быть нулевым, вы также должны учитывать это в запросе. Например. . (ask <> 0 OR ask IS NULL) .)

Комментарии:

1. Спасибо за объяснение и упрощение. AND NOT здесь у меня получилось лучше всего.

Ответ №2:

Вы можете попробовать ниже —

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

Комментарии:

1. Спасибо за предложение. Я пытаюсь, но испытываю трудности — кажется, потому, что у меня должны быть an IN и a NOT IN в одном запросе. (Я скорректировал свою таблицу данных выше, чтобы отразить, что их больше, чем просто два символа.)

2. @Daniel Sims: Какое это имеет значение? Вы также хотите исключить из своего результата символы, отличные от ‘SPX’ и ‘VIX’?

3. Правильно, я хочу выбрать только SPX и VIX — и оставить NDX.

4. Прошу прощения за мою неясность. По какой-то причине я не смог приступить NOT IN к работе. Я буду продолжать возиться с этим в будущем. Я очень ценю вашу помощь.

5. @Daniel Sims: Возможно, presto не поддерживает [NOT] IN кортежи. Некоторые СУБД делают, другие нет.