Синтаксис для избежания нескольких подзапросов в Postgres - PullRequest
2 голосов
/ 03 апреля 2011

Я новичок в postgres, поэтому, пожалуйста, успокойтесь.

Я пытаюсь написать запрос, чтобы для любого пользователя я мог извлечь ВСЕ файлы журналов (как их действия, так и действия других) за одну минуту до и одну минуту после того, как его имя появилось в журналах в пределах та же самая партия

chat.batchstamp is varchar
chat.datetime is timestamp
chat.msg is text
chat.action is text    (this is the field with the username)

Вот отдельные команды, которые я хочу использовать, я просто не знаю, как их собрать, и действительно ли это правильный путь для этого.

SELECT batchstamp, datetime, msg FROM chat WHERE action LIKE 'username';

Ожидаемый выход:

batchstamp   datetime      msg  
abc          2010-12-13 23:18:00 System logon          
abc          2010-12-13 10:12:13 System logon    
def          2010-12-14 11:12:18 System logon

SELECT * FROM chat WHERE datetime BETWEEN datetimefrompreviousquery - interval '1 minute' AND datetimefrompreviousquery + interval '1 minute';

Не могли бы вы помочь мне объяснить, что мне следует делать, чтобы передать данные из предыдущего запроса во второй запрос? Я посмотрел на подзапросы, но мне нужно запустить два подзапроса? Должен ли я построить временную таблицу?

После того, как все это сделано, как мне убедиться, что время совпадения запроса находится в пределах одной пакетной отметки?

Если вы можете указать мне правильное направление, это здорово. Если вы можете предоставить запрос, это даже лучше. Если мое объяснение не имеет смысла, возможно, я слишком долго на это смотрю.

Спасибо за ваше время.

На основе приведенного ниже кода Нейта С я использовал это:

SELECT * FROM chat, 
( SELECT batchstamp, datetime FROM chat WHERE action = 'fakeuser' ) 
AS log WHERE chat.datetime BETWEEN log.datetime - interval '1 minute' AND log.datetime + '1 minute';

Кажется, он не возвращает каждое попадание в «fakeuser», и когда это происходит, он извлекает журналы из каждой «пакетной метки» вместо того, где был найден «fakeuser». Я для другого вложенного запроса? Как называется этот тип процедуры, чтобы я мог продолжить ее изучение?

Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2011

Ваш первый запрос может входить в предложение from с '(', заключенными в квадратные скобки и именем 'как псевдоним'. После этого вы можете ссылаться на него, как в обычной таблице в остальной части запроса.

SELECT
* 
FROM chat,
(
    SELECT
        batchstamp,
        datetime, 
        msg
    FROM log
    WHERE action LIKE 'username'
) AS log

WHERE chat.datetime BETWEEN
    log.datetime - interval '1 minute'
    AND log.datetime + interval '1 minute';

Это должно помочь вам начать.

0 голосов
/ 04 апреля 2011

Коллега на работе придумал следующее решение, которое, кажется, дает результаты, которые я ищу. Спасибо всем за помощь.

SELECT batchstamp, datetime, msg INTO temptable FROM chat WHERE action = 'fakeusername';

select a.batchstamp, a.action, a.datetime, a.msg
FROM chat a, temptable b
WHERE a.batchstamp = b.batchstamp
and (
a.datetime BETWEEN b.datetime - interval '1 minute'
AND b.datetime + interval '1 minute'
) and a.batchstamp = '2011-3-1 21:21:37'
group by a.batchstamp, a.action, a.datetime, a.msg
order by a.datetime;
...