SQL分组相关列

时间:2017-02-05 00:30:55

标签: sql sql-server group-by select-query

假设我有一个包含2列的表格,如下所示:

Person1, Person2
David    Jessica
Jessica  David
David    Oz
Oz       David
Guy      Richard
Richard  Guy
Jessica  Oz
Oz       Jessica

和另一个包含2列的表格:

Person   Last Posted
David    12/8/2016
Jessica  5/10/2016
Oz       23/11/2016
Guy      8/3/2016
Richard  27/6/2016

假设玩家名称是唯一的,并且只会出现一次。 如何选择最新帖子的人? 这个例子的相关组是(David,Jessica,Oz),(Guy,Richard)

输出应为:

Person
Oz
Richard

3 个答案:

答案 0 :(得分:1)

这个应该有效。在第一个子查询中,称为获胜者,列出每个配对的最新帖子的人。然后将其连接到名为loser的第二个子查询,该查询列出每个配对中具有最近帖子的人。输出应该返回获胜者子查询中的人而不是输家中的人。进入失败者子查询会证明你小组中的某个人有比你更近的帖子:

SELECT DISTINCT winner.person
FROM
(SELECT
 CASE WHEN t2_1.last_post > t2_2.last_post THEN person1 ELSE person2 END AS person
 FROM t1
 INNER JOIN t2 t2_1 ON t1.person1 = t2_1.person
 INNER JOIN t2 t2_2 ON t1.person2 = t2_2.person) winner
LEFT JOIN
(SELECT
 CASE WHEN t2_1.last_post < t2_2.last_post THEN person1 ELSE person2 END AS person
 FROM t1
 INNER JOIN t2 t2_1 ON t1.person1 = t2_1.person
 INNER JOIN t2 t2_2 ON t1.person2 = t2_2.person) loser
ON winner.person = loser.person
WHERE loser.person IS NULL

在这里测试:http://sqlfiddle.com/#!9/6ef390/13

答案 1 :(得分:0)

假设您的第一个表是table1而第二个表是table2,那么:

select 
Person = case when isnull(t1.[last posted],'1900-01-01')>isnull(t2.[last posted],'1900-01-01') then t.person1 else t.person2 end

from 
table1 t
left join table2 t1 on t.person1=t1.person
left join table2 t2 on t.person2=t2.person

(如果您知道自己没有找到过没有发布过的人,则可以省略使用isnull并使用inner joins

答案 2 :(得分:0)

这个问题写得不好。我为选择具有最新日期的不同用户的步骤编写了一个解决方案,但结果与您编写的内容不同。不确定你的目标是什么样的逻辑。

加入第二个表(发布表两次),然后使用greatest函数:

select distinct case when posts1.last_posted = greatest(posts1.last_posted,posts2.last_posted) then posts1.person else posts2.person end as latest_person from games left join posts as posts1 on games.person1 = posts1.person left join posts as posts2 on games.person2 = posts2.person