SQL 分组相关列

SQL grouping related columns

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

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

和另一个 table 有 2 列:

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

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

输出应该是:

Person
Oz
Richard

假设您的第一个 table 是 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

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

加入第二个table(发帖table两次)然后使用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

这个应该可以。在第一个 sub-query 中,称为获胜者,列出每个配对的最近 post 的人。然后将其加入第二个 sub-query,称为失败者,它列出了每个配对最近 post 的人。输出应该 return 人在赢家 sub-query 而不是输家。处于失败者 sub-query 将表明您组中的某个人 post 比您更近:

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