【问题标题】:Syntax for Avoiding Multiple Subqueries In Postgres在 Postgres 中避免多个子查询的语法
【发布时间】:2011-04-03 01:32:02
【问题描述】:

我是 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';

您能帮我解释一下我应该怎么做才能将前一个查询中的数据输入到第二个查询中吗?我看过子查询,但我需要运行两个子查询吗?我应该建立一个临时表吗?

全部完成后,如何确保查询匹配的时间在同一个batchstamp内?

如果您能够为我指明正确的方向,那就太好了。如果您能够提供查询,那就更好了。如果我的解释没有意义,可能是我看这个太久了。

感谢您的宝贵时间。

基于下面 nate c 的代码,我使用了这个:

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”的每一次点击,当它返回时,它会从每个“batchstamp”中提取日志,而不仅仅是找到“fakeuser”的那个。我要进行另一个嵌套查询吗?这种类型的程序叫什么,我可以进一步研究它?

再次感谢。

【问题讨论】:

  • 用户名在哪个字段?
  • 同一个batchstamp中的所有日志文件。哪个是日志文件列?乍一看,我认为 nate c 的答案是正确的,但作为他,我也对 batchstamp 与日志文件感到困惑
  • “batchstamp”列标识它来自哪个日志文件。我所有的日志文件都被转储到一张表中。我可以通过查看“batchstamp”来判断条目来自哪个文件。我想在同一个batchstamp中找到特定用户活动之前和之后的所有活动。对不起,令人费解的解释。感谢您提供帮助。

标签: postgresql nested subquery


【解决方案1】:

您的第一个查询可以在 from 子句中使用 '(' 括号和 'as alias' 名称。之后您可以像在查询的其余部分中使用普通表一样引用它。

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

这应该让你开始。

【讨论】:

  • 在原始帖子的上方添加了 cmets。感谢您的回复,我可以说我现在已经完成了。
【解决方案2】:

一位同事想出了以下解决方案,似乎提供了我正在寻找的结果。感谢大家的帮助。

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2015-02-16
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多