【问题标题】:SQL query/procedure to find best match between two tables based on most matched columnsSQL 查询/过程根据最匹配的列在两个表之间找到最佳匹配
【发布时间】:2019-12-03 20:18:24
【问题描述】:

我需要一个 SQL 查询/程序来根据给定访问者的性别、最匹配的兴趣和学术领域找到最匹配的主机。我有以下表格:

HOSTS: 
HOST_ID  GENDER   INTEREST_ONE_ID       INTEREST_TWO_ID   ACADEMIC_FIELD_ID     NUM_CAN_HOST
   A       M            1                    2                   10                    2
   B       M            5                    4                    3                    1
   C       F            2                    1                    3                    2
   D       F            1                    2                   10                    3 
   E       M            5                    1                    3                    1
   F       M            5                    1                    6                    1

VISTORS:
VISTOR_ID  GENDER INTEREST_ONE_ID       INTEREST_TWO_ID   ACADEMIC_FIELD_ID 
   1         M          2                       1                10
   2         M          5                       4                 3
   3         M          1                       2                 2
   4         F          4                       1                 6

请注意,所有兴趣 id 都来自相同的列表,academic_field_id 也是如此(但自然来自与兴趣不同的列表)。所以我想要一个查询/程序,它首先根据性别返回给定访问者的前 X 个最佳主机匹配,而不是根据哪些主机匹配最多的兴趣和学术领域。兴趣匹配不重要(interest_one 可以匹配interest_two,反之亦然)。因此,Vistor 1 的示例输出:

BEST_MATCHES (for Vistor 1..only males with most matches) 
VISITOR_ID HOST_ID      INTEREST_ONE_MATCH   INTEREST_TWO_MATCH   Academic_int_MATCH
   1         A               x [one to two]      x [two to one]        x
   1         B                 -                    -                  -     Next best..which is not too good!

和访客 2:

BEST_MATCHES 
VISITOR_ID HOST_ID      INTEREST_ONE_MATCH   INTEREST_TWO_MATCH   Academic_int_MATCH
   2         B               x                   x                     x
   2         E               x                   -                     x     
   2         F               x                   -                     -   

等等。

【问题讨论】:

  • 您使用的是哪个 dbms?

标签: sql group-by rank


【解决方案1】:

这是一个昂贵的查询,但是:

select hv.
from (select h.host_id, v.visitor_id,
             (case when h.INTEREST_ONE_ID = v.INTEREST_ONE_ID then 'X' end) as INTEREST_ONE_ID_match,
             (case when h.INTEREST_TWO_ID = v.INTEREST_TWO_ID then 'X' end) as INTEREST_TWO_ID_match,
             . . . ,
             dense_rank() over (partition by h.host_id
                                order by ((case when h.INTEREST_ONE_ID = v.INTEREST_ONE_ID then 1 else 0 end) +
                                          (case when h.INTEREST_TWO_ID = v.INTEREST_TWO_ID then 1 else 0 end) +
                                          . . .
                                         ) desc
                               ) as seqnum
      from hosts h cross join
           visitors v
     ) hv
where seqnum = 1;

【讨论】:

  • 感谢您的快速回复..但是我什至无法运行它(基于我对省略号和顶部选择值的解释)。我一直得到“缺少关键字”..很明显我没有正确理解这一点。
  • 从两个兴趣入手,看看能不能如你所愿。然后,您可以一次添加一列。
  • 是的,一直在玩它发现了我的问题 - 是 (case ...) 语句中缺少的“结束”。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多