Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 带join的条件语句_Sql_Sql Server - Fatal编程技术网

Sql 带join的条件语句

Sql 带join的条件语句,sql,sql-server,Sql,Sql Server,我有两个数据集,df1和df2,我希望将这两个数据集连接起来,然后应用一个条件,即如果主机列中有多个重复的行,则只取这一行以避免重复。我将在df1.version=df2.name和df1.date=df2.date加入df1和df2 条件:目的应='hi'或目的应='cat' df1 df2 以下是连接结果: version host date name purpose date pat

我有两个数据集,df1和df2,我希望将这两个数据集连接起来,然后应用一个条件,即如果主机列中有多个重复的行,则只取这一行以避免重复。我将在df1.version=df2.name和df1.date=df2.date加入df1和df2

条件:目的应='hi'或目的应='cat'

df1

df2

以下是连接结果:

version host    date                 name    purpose       date                      
pat     a16     12/1/2019            pat     hi            12/1/2019
fam     a16     12/1/2019            fam     cat           12/1/2019
渴望的


我想我必须在SQL中实现IF-THEN语句。上面的语句只执行连接,但它不会删除连续的重复主机行。欢迎提出任何建议

您可以应用行数函数并对行进行排序以删除重复行。但是,由于您按日期排序,目的行可以是hi或cat。如果您想特别选择其中一个作为第一个,您必须相应地申请订单

;以cte_df为例 选择df1.version、df1.host、df1.date、df2.name、df2.purpose、df2.date作为df2date ,按df1超额分配的行号。按df1超额分配的主机订单。日期为rnk 来自df1 内连接df2 在df1.version=df2.name和df1.date=df2.date上 其中df2.1在“hi”和“cat”中 从cte_df中选择*其中rnk=1 不使用_CTE,使用派生表

选择* 从…起 选择df1.version、df1.host、df1.date、df2.name、df2.purpose、df2.date作为df2date ,按df1超额分配的行号。按df1超额分配的主机订单。日期为rnk 来自df1 内连接df2 在df1.version=df2.name和df1.date=df2.date上 其中df2.1在“hi”和“cat”中 AS T 其中rnk=1
您可以应用ROW_NUMBER函数并对行进行排序以删除重复的行。但是,由于您按日期排序,目的行可以是hi或cat。如果您想特别选择其中一个作为第一个,您必须相应地申请订单

;以cte_df为例 选择df1.version、df1.host、df1.date、df2.name、df2.purpose、df2.date作为df2date ,按df1超额分配的行号。按df1超额分配的主机订单。日期为rnk 来自df1 内连接df2 在df1.version=df2.name和df1.date=df2.date上 其中df2.1在“hi”和“cat”中 从cte_df中选择*其中rnk=1 不使用_CTE,使用派生表

选择* 从…起 选择df1.version、df1.host、df1.date、df2.name、df2.purpose、df2.date作为df2date ,按df1超额分配的行号。按df1超额分配的主机订单。日期为rnk 来自df1 内连接df2 在df1.version=df2.name和df1.date=df2.date上 其中df2.1在“hi”和“cat”中 AS T 其中rnk=1
只坐第一排。。。什么定义了这里的第一行?add和row_id=1。重复行是什么意思?我希望从示例输出的“host”列中删除任何重复行,是的,有两行的主机值为a16,但选择version=pat的行还是version=fam的行,由什么业务逻辑决定?这对于提出一个有效的解决方案是非常关键的。。。什么定义了这里的第一行?add和row_id=1。重复行是什么意思?我希望从示例输出的“host”列中删除任何重复行,是的,有两行的主机值为a16,但选择version=pat的行还是version=fam的行,由什么业务逻辑决定?这对于建议一个有效的解决方案非常重要。谢谢,当“主机”列中存在重复项时,有没有办法删除行?是的。这就是在这个问题中需要注意的。我们按主机进行分区并生成行号。因此,对于第一个主机行,秩将为1。只有它在列表中被选中end@Lynn,您不需要CTE。可以使用派生表。我已将该解决方案添加到回答共享您的小提琴链接中,以便我们可以在这方面帮助您it@Lynn,您提到它是sql server。fiddle不利于MySQL谢谢,当“主机”列中存在重复项时,有没有办法删除行?是的。这就是在这个问题中需要注意的。我们按主机进行分区并生成行号。因此,对于第一个主机行,秩将为1。只有它在列表中被选中end@Lynn,您不需要CTE。可以使用派生表。我已将该解决方案添加到回答共享您的小提琴链接中,以便我们可以在这方面帮助您it@Lynn,您提到它是sql server。小提琴是反对mySQL的
name    purpose  date
pat     hi       12/1/2019
fam     cat      12/1/2019
hello   dog      12/1/2019
dan     bird     12/1/2019
version host    date                 name    purpose       date                      
pat     a16     12/1/2019            pat     hi            12/1/2019
fam     a16     12/1/2019            fam     cat           12/1/2019
version host    date                 name    purpose       date                      
pat     a16     12/1/2019            pat     hi            12/1/2019
select    df1.version, df1.host, df1.date, df2.name, df2.purpose, df2.date
from      df1
left join df2
on        df1.version = df2.name  AND
          df1.date    = df2.date
where     df2.purpose = 'hi' OR df2.purpose = 'cat'