Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于最匹配列查找两个表之间最佳匹配的SQL查询/过程_Sql_Group By_Rank - Fatal编程技术网

基于最匹配列查找两个表之间最佳匹配的SQL查询/过程

基于最匹配列查找两个表之间最佳匹配的SQL查询/过程,sql,group-by,rank,Sql,Group By,Rank,我需要一个SQL查询/过程,根据给定访客的性别、最匹配的兴趣和学术领域,为他们找到最匹配的主机。我有以下表格: HOSTS: HOST_ID GENDER INTEREST_ONE_ID INTEREST_TWO_ID ACADEMIC_FIELD_ID NUM_CAN_HOST A M 1 2 10 2 B

我需要一个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都来自相同的列表,学术领域id也来自相同的列表(但来自与兴趣不同的列表)。因此,我需要一个查询/过程,首先根据性别返回给定访客的前X个最佳主机匹配,而不是根据哪个主机匹配的兴趣和学术领域最多。利益匹配不重要的地方(利益一方可以匹配利益二方,反之亦然)。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!
和vistor 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                   -                     -   

等等。

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

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;

您使用的是哪种dbms?感谢您的快速回复。但是,嗯,我甚至无法运行它(根据我对省略号和top select值的解释)。我总是得到“缺少的关键字”。所以很明显我没有正确理解。从两个兴趣点开始,看看它是否符合你的要求。然后你可以一次添加一个额外的列。是的,一直在玩它解决了我的问题-TWA是order by(case…)语句中缺少的“end”。谢谢