首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql分组依据

postgresql分组依据
EN

Stack Overflow用户
提问于 2018-02-22 11:54:54
回答 3查看 52关注 0票数 0

这是我在Postgresql中的查询:

代码语言:javascript
复制
SELECT 
    C.id, S.domen, B.name, C.source_id, ST.name 
FROM "calls" C 
    INNER JOIN "site" S ON S.id=C.site_id 
    INNER JOIN "sources" ON sources.id=C.source_id 
    INNER JOIN "brand" B ON B.id = S.id_brand
    INNER JOIN "source_types" ST ON ST.id = "sources".type_id 
WHERE 
    ("calltime" >= '2017-12-01') AND 
    ("calltime" <= '2017-12-03') AND 
    (S."id_brand"='6') 
ORDER BY "calltime" LIMIT 50

我得到的结果是:

现在,我尝试按名称(最后一列)对此结果进行分组,以获得如下结果:

代码语言:javascript
复制
Контекстная реклама - 17
SEO-10
.... 

为此,我使用以下查询:

代码语言:javascript
复制
SELECT 
    ST.name, count(ST.name) 
FROM "calls" C 
    INNER JOIN "site" S ON S.id=C.site_id 
    INNER JOIN "sources" ON sources.id=C.source_id 
    INNER JOIN "brand" B ON B.id = S.id_brand
    INNER JOIN "source_types" ST ON ST.id = "sources".type_id 
WHERE 
    ("calltime" >= '2017-12-01') AND 
    ("calltime" <= '2017-12-03') AND 
    (S."id_brand"='6') 
GROUP BY ST.name 
ORDER BY count(ST.name) DESC LIMIT 50

但是我得到了错误的结果:

它似乎是从source_id列中获取值。我做错了什么?

EN

回答 3

Stack Overflow用户

发布于 2018-02-22 12:26:31

试试看,如果你在限制结果之前调用group by,然后对整个记录调用group by。因此,首先筛选,然后执行分组依据。

代码语言:javascript
复制
    SELECT 
        name, count(name) 
    FROM(
    SELECT 
        ST.name 
    FROM "calls" C 
        INNER JOIN "site" S ON S.id=C.site_id 
        INNER JOIN "sources" ON sources.id=C.source_id 
        INNER JOIN "brand" B ON B.id = S.id_brand
        INNER JOIN "source_types" ST ON ST.id = "sources".type_id 
    WHERE 
        ("calltime" >= '2017-12-01') AND 
        ("calltime" <= '2017-12-03') AND 
        (S."id_brand"='6') 
    ORDER BY "calltime" LIMIT 50
    ) T 
    GROUP BY name 
票数 1
EN

Stack Overflow用户

发布于 2018-02-22 12:20:56

49号可能只是个巧合。尝试:

代码语言:javascript
复制
SELECT 
    ST.name, count(*) 
FROM "calls" C 
    INNER JOIN "site" S ON S.id=C.site_id 
    INNER JOIN "sources" ON sources.id=C.source_id 
    INNER JOIN "brand" B ON B.id = S.id_brand
    INNER JOIN "source_types" ST ON ST.id = "sources".type_id 
WHERE 
    ("calltime" >= '2017-12-01') AND 
    ("calltime" <= '2017-12-03') AND 
    (S."id_brand"='6') AND 
    C.source_id > 50
GROUP BY ST.name 
ORDER BY count(*) DESC LIMIT 50

我所做的就是将其更改为count(*)并将AND C.source_id > 50添加到Where子句中。让我们看看这是否会改变计数。

您也可以只运行以下命令:

代码语言:javascript
复制
SELECT 
    count(*) 
FROM "calls" C 
    INNER JOIN "site" S ON S.id=C.site_id 
    INNER JOIN "sources" ON sources.id=C.source_id 
    INNER JOIN "brand" B ON B.id = S.id_brand
    INNER JOIN "source_types" ST ON ST.id = "sources".type_id 
WHERE 
    ("calltime" >= '2017-12-01') AND 
    ("calltime" <= '2017-12-03') AND 
    (S."id_brand"='6') 

这将给出所有行的总计数(我删除了GROUP BY)。如果这个数字等于分组行计数的总和,那么它们就是真正的计数。我们正在寻找的是49 + 30 + 21 + 13 + 9 + 4 + 1127

我希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2018-02-22 12:23:09

第二个查询中的LIMIT 50GROUP BY之后执行。

如果只想聚合前50行,请将LIMIT 50写入子选择并在外部SELECT中执行GROUP BY

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48919402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档