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