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
假设我有一个包含 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