查询数据库获取第一个唯一值

Posted

技术标签:

【中文标题】查询数据库获取第一个唯一值【英文标题】:Query database to obtain first unique value 【发布时间】:2018-12-06 22:02:03 【问题描述】:

我有一个非常简单的表格,如下所示:

id  |  custom_id   |   answer
----------------------------------
1   |  123         |   Answer 1
__________________________________
2   |  123         |   Answer 2
__________________________________
3   |  422         |   Answer 3
__________________________________
4   |  345         |   Answer 2
__________________________________
5   |  992         |   Answer 1
__________________________________
6   |  452         |   No answer
__________________________________

我要做的是计算Answer 1Answer 2 等的数量。因此,对于上述数据,我希望得到:

2 * Answer 1
2 * Answer 2
1 * Answer 3

请注意,任何 No answer 都应该被丢弃。

然而,除此之外,我只想考虑每个custom_id 的一个答案,这应该是他们的第一个答案。所以真的,我期望得到的上述数据的输出应该是:

2 * Answer 1
1 * Answer 2
1 * Answer 3

这是因为我们只接受custom_id = 123 的第一个答案。

到目前为止,我进行了以下查询:

select
    answer,
    count(*) as totalCount
from
    " . DB_TABLE . "
where
    answer <> 'No answer'
group by
    custom_id

但是,这似乎返回了总计数(正如我首先解释的那样),没有考虑到每个 custom_id 应该只有一个。我以为 group by 会解决这个问题,但似乎不是这样。

我怎样才能达到我所追求的结果?

谢谢

【问题讨论】:

【参考方案1】:

一种方法,首先是为每个custom_id 创建一个带有IDs 的第一个答案的派生表,并过滤那些具有No answer 值的表(因为您想忽略它们),如下所示:

SELECT
    custom_id,
    MIN(id) AS firstAnswerID
FROM
    <table_name>
WHERE
    answer <> "No Answer"
GROUP BY
    custom_id

然后,我们可以在 ID 列上将原始表与前一个表连接起来(这将像过滤器一样过滤那些不是第一个答案或具有 No answer 值的人),创建一个 GROUP BY answer 列并计算每个的数量。总之,这会做你想做的事:

SELECT
    t1.answer,
    COUNT(*) AS NumTimes
FROM
    <table_name> AS t1
INNER JOIN
    ( SELECT
          custom_id,
          MIN(id) AS firstAnswerID
      FROM
          <table_name>
      WHERE
          answer <> "No Answer"
      GROUP BY
          custom_id ) AS t2 ON t2.firstAnswerID = t1.id
GROUP BY
    t1.answer
ORDER BY
    NumTimes DESC

你可以在这里玩这个:DB Fiddle

【讨论】:

【参考方案2】:

尝试使用这个:

select answer, count(answer) as totalCount from " . DB_TABLE .
" where answer <> 'No answer' group by answer

您应该计算每个答案组的行数,而不是整个表格。

【讨论】:

我刚刚尝试过,但它仍然返回 custom_id 的重复项 count(*)count(answer) 之间的唯一区别是如果有空答案,那么count(answer) 将不计算在内。 见***.com/questions/2876909/…

以上是关于查询数据库获取第一个唯一值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Anylogic 中的插入数据库查询基于另一列获取一列的唯一值?

如何查询按核心数据中唯一值分组的值?

从 VBScript 中的访问查询中获取值

如何使用选择查询为每个唯一的第二个值获取一个值中的最小值?

从搜索查询中获取唯一值以填充搜索过滤器选项

Grafana 查询以获取唯一的标签值