gpt4 book ai didi

MYSQL 查询帮助 : Results are not 100 percent accurate

转载 作者:行者123 更新时间:2023-11-28 23:58:16 24 4
gpt4 key购买 nike

我有一个包含调用详细记录的 mysql 数据库。在这个特定的查询中,我想搜索所有调用以了解调用断开的原因,并返回断开连接原因的列表以及每个原因发生的次数。

示例结果集如下所示:

 causeCode | count
|
0 | 380
16 | 289
47 | 2

一条记录代表一次调用。每条包含断开连接原因的记录都有两个字段,origCause_value 指定发起方断开的调用断开连接的原因,destCause_value 指定断开连接的调用断开连接的原因由被叫方。

我正在使用的查询在大多数情况下都运行良好,但问题在于此。起初我认为每条记录在 origCause_valuedestCause_value 中只有 1 个值,具体取决于哪一方断开了调用。我发现虽然这在大多数情况下都是正确的,但有些记录同时填写了两个字段。这会影响我的计数,因此它不是 100% 准确。

例如:

 Above shows that cause code 47 was used 2 times.  
Technically this is correct because in one record it is in both the
origCause_value and destCause_value field.


However the results i'd like to see returned would be 1.
To indicate the number of calls that were terminated with cause code 47

这是我正在使用的查询:

 SELECT c.causeCode, sum(count) as count
FROM ((SELECT origCause_value as causeCode, COUNT(origCause_value) AS count
FROM CDR
GROUP BY causeCode
) UNION ALL
(SELECT destCause_value as causeCode, COUNT(destCause_value) AS count
FROM CDR
GROUP BY causeCode
)
) c
GROUP BY c.causeCode ORDER BY count DESC

我正在寻求帮助,看看是否有办法进一步过滤它以获得所需的结果。

示例表:

 id  | CallingPartyNumber | finalCalledPartyNumber | origCause_value | destCause_value
1 5551212 7771212 16 0
2 5551212 7771212 0 16
3 7771212 5551212 47 47
4 7771212 5551212 16 0
5 5551212 777121 16 0

提前致谢。

最佳答案

47(无资源)是一个奇怪的原因代码。发生这种情况时,两端可以同时断开连接。

大多数调用只有一端有断开连接原因代码。您的 CDR 表显示了未导致断开连接的最后一个原因为零。

您显然希望断开连接原因的数量与 CDR 中的行数相同,否则您会感到困惑。

   SELECT COUNT(*) cause_count, 
CASE WHEN origCause_value <> 0
THEN origCause_value
ELSE destCause_value
END cause_value
FROM CDR
GROUP BY CASE WHEN origCause_value <> 0
THEN origCause_value
ELSE destCause_value
END
ORDER BY COUNT(*) DESC

下面是这个查询的演示。 http://sqlfiddle.com/#!9/a8527/1/0

CASE 语句从每条记录中获取非零原因代码。

您也可以使用 GREATEST(origCause_value, destCause_value),但它可能不够健壮。

(我编辑了这个答案;我之前对 COALESCE() 的使用假定未设置原因代码为 NULL,而不是零)。

编辑

您的新样本 ( http://sqlfiddle.com/#!9/9f3ba/1) 的第二条记录是:

 (2,5551212,7771212,393216,16),

这是什么意思?这应该算作“16”——来自接收端的正常调用终止吗?或者 393216 值 (0x60000) 是否有某种特殊含义?

正确计数可能意味着您需要理解这些成对原因代码的含义。我给您的查询会将 CDR 计为 393216,因为它选择第一个数字,而不是第二个数字。

关于MYSQL 查询帮助 : Results are not 100 percent accurate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30869854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com