sql - 如何编写一个函数来比较和排列多组 bool (真/假)答案?

标签 sql language-agnostic database-design data-structures computer-science

我开始了一个比我最初想象的要复杂得多的项目。我正在尝试规划一个基于 bool (真/假)问题和答案的系统。系统上的用户可以回答大量 bool (真/假)问题中的任何问题,并根据他们的答案显示最相似用户的列表(按相似度排序)。

我在谷歌上搜索了很多,但仍然没有想出太多,所以我希望有人能指出我正确的方向。我想知道:

存储此类数据的最佳数据结构和方法是什么? 我最初假设我可以在 SQL 数据库中创建两个表“问题”和“答案”。但是,我不知道如果将两组答案都列为数字字符串,比较它们是否会更简单。 IE。 0 = 未回答,1 = 真,2 = 假。当比较字符串时,可以为“未回答”= 0、“相同答案”= 1、“相反答案”= -1 添加权重,从而产生相似性分数。

我将如何比较两组答案? 为了能够计算出这组答案之间的“相似性”,我将不得不编写一个比较函数。有谁知道什么样的比较最适合这个问题?我查看了 sequence alignment我认为这可能是正确的方法,但我不确定,因为这要求数据按长序列排列,而且问题不相关,因此不是自然的序列。

如何将此比较函数应用于大量数据? 一旦我编写了比较函数,我就可以将每个用户的答案与每个其他用户的答案进行比较,但这似乎不是很有效,并且可能不会很好地扩展。我一直在调查cluster analysis根据类似答案自动对用户进行分组的方法,您认为这可行吗,或者有人知道我可以研究的更好方法吗?

我真的很感激任何有用的指针。谢谢!

最佳答案

如果您要在 SQL 中使用用户、问题和答案表来设置它,那么我相信以下 SQL 可用于让其他用户获得类似的响应。只需添加一个 TOP 子句即可获得所需的数字。

我不知道性能如何,但这在很大程度上取决于您的数据大小。

SELECT
    U2.userid,
    SUM(CASE
            WHEN A1.answer = A2.answer THEN 1
            WHEN A1.answer <> A2.answer THEN -1
            WHEN A1.answer IS NULL OR A2.answer IS NULL THEN 0  -- A bit redundant, but I like to make it clear
            ELSE 0
        END) AS similarity_score
FROM
    Questions Q
LEFT OUTER JOIN Answers A1 ON
    A1.question_id = Q.question_id AND
    A1.userid = @userid
LEFT OUTER JOIN Answers A2 ON
    A2.question_id = A1.question_id AND
    A2.userid <> A1.userid
LEFT OUTER JOIN Users U2 ON
    U2.userid = A2.userid
GROUP BY
    U2.userid
ORDER BY
    similarity_score DESC

关于sql - 如何编写一个函数来比较和排列多组 bool (真/假)答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3320306/

相关文章:

mysql - 包含引用同一个表的两个外键的复合主键 : SQL Server vs. MySQL

sql - Oracle SQL (Oracle 11g) 中的排名优于分区依据

sql - 对于金融数据,对 DATETIME 建立索引有用吗?

language-agnostic - 可以表示集合或单个项目的参数的命名约定(或术语)

regex - 使用正则表达式匹配两个字符串之间的字符串

sql - 这个问题的最佳实践是什么(不同类别的不同属性)?

sql - 编写可移植 SQL 的必要性或便利性如何?

sql - 在 PostgreSQL 9.6 中,扩展填充有简单 JSON 字典的 JSONB 列的最简单方法是什么?

mysql - 获取我评论过的帖子以及新评论吗?

python - 是否有类似 "iterate iterable if it has elements, else ..."的结构?