【问题标题】:selecting multiple columns but group by only one in postgres在postgres中选择多列但仅按一列分组
【发布时间】:2018-04-24 03:07:50
【问题描述】:

我在 postgres 中有一个简单的表格:

remoteaddr        count
142.4.218.156     592
158.69.26.144     613
167.114.209.28    618

我使用以下内容提取:

select remoteaddr,
count (remoteaddr)
from domain_visitors
group by remoteaddr
having count (remoteaddr) > 500

如何选择其他列并且仍然只按remoteaddr 分组?

【问题讨论】:

  • 请给您的表格完整结构

标签: postgresql group-by


【解决方案1】:

选项 1:您可以使用 array_agg() 函数将其他列值连接到一个分组列表中:

SELECT 
   remoteaddr, 
   array_agg(DISTINCT username) AS unique_users, 
   array_agg(username) AS repeated_users, 
   count(remoteaddr) as remote_count
FROM domain_visitors
GROUP BY remoteaddr;

this SQL Fiddle。此查询将返回如下内容:

+----------------+---------------------------------+-----------------------------------------------------------------------------------------------------+--------------+
|   remoteaddr   |          unique_users           |                                           repeated_users                                            | remote_count |
+----------------+---------------------------------+-----------------------------------------------------------------------------------------------------+--------------+
|  142.4.218.156 | anotheruser,user9688766,vistor1 | user9688766,anotheruser,vistor1,vistor1,vistor1,vistor1,vistor1,anotheruser,anotheruser,anotheruser |           10 |
|  158.69.26.144 | anotheruser,user9688766         | anotheruser,user9688766,user9688766,user9688766,user9688766                                         |            5 |
| 167.114.209.28 | vistor1                         | vistor1                                                                                             |            1 |
+----------------+---------------------------------+-----------------------------------------------------------------------------------------------------+--------------+

选项 2:您可以将您的第一个查询放在 common table expression(又名“WITH”子句)中,并将其与原始表连接起来,如下所示:

WITH grouped_addr AS (
  SELECT remoteaddr, count(remoteaddr) AS remote_count
  FROM domain_visitors
  GROUP BY remoteaddr
)

SELECT ga.remoteaddr, dv.username, ga.remote_count
FROM grouped_addr ga
INNER JOIN domain_visitors dv
ON ga.remoteaddr = dv.remoteaddr
WHERE remote_count > 500;

这是SQL Fiddle

请记住,这将返回任何其他列的重复结果(在本例中为username)。这通常不是你想要的。请注意 Fiddles 中的每个 SELECT 示例,看看哪个最适合您的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2015-03-27
    • 2019-04-08
    相关资源
    最近更新 更多