具有连接的列的平均值

时间:2018-02-22 16:35:09

标签: sql postgresql

我正在尝试获取时间列的平均值,并且我使用很少的关系来过滤它们,问题是某些行正在被复制,因为它们有两条或更多条消息。考虑到我有以下表格和行(PostgreSQL 9.4)

|------------------------------|-----------|
| Times Table                              |
|----------|-------------------|-----------|
|   time   |   conversation    |   first   |
|----------|-------------------|-----------|
|   81250  |   1               |   true    |
|----------|-------------------|-----------|
|   63457  |   2               |   true    |
|----------|-------------------|-----------|
|   31592  |   3               |   true    |
|----------|-------------------|-----------|
|   33987  |   4               |   true    |
|----------|-------------------|-----------|

|------------------------|
| Conversations Table    |
|----------|-------------|
|    id    |   active    |
|----------|-------------|
|    1     |   true      |
|----------|-------------|
|    2     |   true      |
|----------|-------------|
|    3     |   true      |
|----------|-------------|
|    4     |   true      |
|----------|-------------|

|--------------------------------------------|
| Messages Table                             |
|----------|-------------------|-------------|
|    id    |   conversation    |    agent    |
|----------|-------------------|-------------|
|    33    |   1               |    31181    |
|----------|-------------------|-------------|
|    37    |   2               |    17782    |
|----------|-------------------|-------------|
|    41    |   3               |    53132    |
|----------|-------------------|-------------|
|    44    |   3               |    53132    |
|----------|-------------------|-------------|
|    59    |   4               |    94282    |
|----------|-------------------|-------------|

我正在尝试编写一个返回平均时间的查询。因此,对于上面的数据,查询的输出将如下所示:

|--------------------------------------------|
| Average Time                               |
|--------------------------------------------|
| 52571                                      |
|--------------------------------------------|

81250 + 63457 + 31592 + 33987 = 210286/4 = 52571(aprox。)

这是我当前的查询(出了点问题):

SELECT AVG("Times"."time") FROM "Times" AS "Average Time"
INNER JOIN "Conversations" ON "Conversations"."id" = "Times"."conversation" AND "Conversations"."active" = true
INNER JOIN "Messages" ON "Messages"."conversation" = "Conversations"."id" AND "Messages"."agent" IN ('31181', '17782', '53132', '94282')
WHERE "Times"."first" = true;

这给了我以下输出:

|--------------------------------------------|
| Average Time                               |
|--------------------------------------------|
| 48375                                      |
|--------------------------------------------|

81250 + 63457 + 31592 + 31592 + 33987 = 210286/5 = 48375(aprox。)

我正在尝试使用不同的,组和一些其他聚合函数但我失败了。这是一个带有示例的sqlfiddle。

http://sqlfiddle.com/#!9/5833fe/8

1 个答案:

答案 0 :(得分:1)

您可以使用嵌套子查询来避免重复:

SELECT AVG(Times.time) FROM Times
WHERE Times.conversation IN (
    SELECT Conversations.id FROM Conversations 
    INNER JOIN Messages ON Messages.conversation = Conversations.id
      AND Messages.agent IN (31181, 17782, 53132, 94282)
    WHERE Conversations.active = true)
    AND Times.active = true;

http://sqlfiddle.com/#!17/5833f/5