【问题标题】:Select same last names but not same names选择相同的姓氏但不同的名字
【发布时间】:2017-01-22 22:31:27
【问题描述】:

我有一张带有 fname|lname|startyear|endyear 的表

认为具有相同 fname 和 lname 的人是唯一的人。 可以有多个具有相同 fname|lname 的条目。

1)我如何找到属于不同人的所有相同姓氏?

例如 “汤姆”|“杰瑞”|1990|1991|

'弗拉德'|'杰瑞'|1991|1992|

“蒂姆”|“厨师”|1991|1992|

“蒂姆”|“厨师”|1992|1993|

输出:

杰瑞

2) 'Mary' 'Jane' 的两个任期之间服务过哪些人(名字和姓氏)?

例如 “玛丽”|“简”|1989|1990|

'汤姆'|'杰瑞'|1990|1991|

'弗拉德'|'杰瑞'|1991|1992|

“蒂姆”|“厨师”|1991|1992|

“蒂姆”|“厨师”|1992|1993|

'玛丽'|'简'|1993|1994

输出

汤姆杰瑞

杰瑞

蒂姆库克

【问题讨论】:

  • 能否提供样例输入输出?
  • alrite 已编辑。请看一下
  • 在询问 SQL 问题时始终包括您正在使用的特定数据库。

标签: sql


【解决方案1】:

1) 在下面的查询中,内联视图为您提供 fname、lname 的所有唯一组合以及它与 lname 上的原始表的连接,这将为您提供所有唯一的 lname,但有多个名字。

SELECT lname
  FROM table t1
INNER JOIN
    ( SELECT fname,lname
        FROM table 
       GROUP BY fname,lname
       HAVING COUNT(1) = 1 
     ) t2
 ON t1.lname = t2.lname;

2) 在此查询中,内联视图将返回 Mary Jane 服务的条款的最小年份和最大年份,然后将其交叉连接到原始表,并在 startyear 和 endyear 上进行比较,这将为您提供在玛丽·简之间任职的所有姓氏、姓氏。

 SELECT fname,lname
   FROM table t1
  CROSS JOIN 
  ( SELECT MIN(startyear) AS minstart,MAX(endyear) AS maxend
      FROM table 
     WHERE fname = 'Mary' AND lname = 'Jane'
  ) t2
 WHERE t1.startyear >= t2.minstart AND t1.endyear <= t2.maxstart;

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 2023-04-02
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多