Попытка проанализировать два временных интервала - мой подзапрос WHERE возвращает слишком много строк - PullRequest
0 голосов
/ 31 января 2019

Я хочу извлечь все случаи id_hand из таблицы public.statistics , которые попадают в определенные промежутки времени. date_played - это переменная типа timestamp.В schema_b.table_80perc есть две точки данных date_played для id_player 789 (это точки данных, которые указывают «время начала» для двух временных интервалов в public.statistics , что меня интересует).

Я думаю, поэтому я получаю следующую ошибку:

более одной строки, возвращенной подзапросом, используемым в качестве выражения

Как я мог решитьэта проблема?

SELECT id_hand
FROM public.statistics
  WHERE id_player = 789 
  AND date_played between (SELECT date_played 
                           FROM schema_b.table_80perc) 
                  and (SELECT date_played 
                       FROM schema_b.table_80perc) + interval '5 minutes'

редактировать: пример данных

public.statistics

enter image description here

schema_b.table_80perc

enter image description here

schema_b.table_80perc является подмножеством из public.статистика

В этом случае здесь, в конечном счете, мне нужны все id.hand из public.statistics , которые находятся во временных интервалах
05:34: 12 + 5 минут
05:47:10 + 5 минут

Мне нужно автоматизировать это позже для идентификаторов других игроков, поэтому мне нужно автоматизировать их с помощью этих двух таблиц.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете использовать EXISTS подзапрос:

SELECT id_hand
FROM   public.statistics AS ps
WHERE  id_player = 789 
AND EXISTS (
    SELECT 1
    FROM   schema_b.table_80perc AS ss
    WHERE  ss.id_player = ps.id_player
    AND    ps.date_played >= ss.date_played 
    AND    ps.date_played <  ss.date_played + INTERVAL '5 minutes'
)
0 голосов
/ 31 января 2019

Это немного сомнительно, но с данными, которые вы нам дали, это должно сделать:

SELECT id_hand
FROM public.statistics s
  WHERE id_player = 789 
  AND date_played between (SELECT min(date_played) + interval '5 minutes'
                           FROM schema_b.table_80perc t
                           where t.id_player = s.id_player) 
                  and (SELECT max(date_played) + interval '5 minutes'
                       FROM schema_b.table_80perc
                       where t.id_player = s.id_player) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...