【问题标题】:SQL - Select highest value when data across 3 tablesSQL - 当数据跨 3 个表时选择最高值
【发布时间】:2016-05-20 11:04:54
【问题描述】:

我有 3 张桌子:

  1. Person(附一栏PersonKey
  2. Telephone(包括Tel_NumberKeyTel_NumberTel_NumberType 列,例如 1=home、2=mobile)
  3. xref_Person+Telephone(列PersonKeyTel_NumberKeyCreatedDateModifiedDate

我希望从xref_Person+Telephone 中为每个Person 获取最新的(例如最高的Tel_NumberKey),并使用该Tel_NumberKeyTelephone 表中获取实际的Tel_Number

我遇到的问题是我不断收到相同Tel_NumberKey 的重复项。我还需要确保我从 Telephone 表中获得了家庭和移动设备,我一直希望通过每个 Tel_NumberType 的 2 个单独的连接来完成 - 再次得到重复。

尝试了以下方法,但无济于事:

-- For HOME
SELECT 
    p.PersonKey, pn.Phone_Number, pn.Tel_NumberKey
FROM 
    Persons AS p 
INNER JOIN 
    xref_Person+Telephone AS x ON p.PersonKey = x.PersonKey
INNER JOIN 
    Telephone AS pn ON x.Tel_NumberKey = pn.Tel_NumberKey
WHERE 
    pn.Tel_NumberType = 1 -- e.g. Home phone number
    AND pn.Tel_NumberKey = (SELECT MAX(pn1.Tel_NumberKey) AS Tel_NumberKey
                            FROM Person AS p1  
                            INNER JOIN xref_Person+Telephone AS x1 ON p1.PersonKey = x1.PersonKey
                            INNER JOIN Telephone AS pn1 ON x1.Tel_NumberKey = pn1.Tel_NumberKey
                            WHERE pn1.Tel_NumberType = 1
                              AND p1.PersonKey = p.PersonKey
                              AND pn1.Tel_Number = pn.Tel_Number)
ORDER BY 
    p.PersonKey

并且一直在查看以下链接,但仍然不断重复。

SQL select max(date) and corresponding value

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

SQL Server: SELECT only the rows with MAX(DATE)

我确信这一定是可能的,但已经有几天了,无法相信在引用 3 个表格时很难获得最新/最高值。非常感谢任何帮助。

【问题讨论】:

  • 仅供参考尝试使用oracle ANALYTICAL Functions
  • 标记使用的 dbms,答案可能因产品而异。
  • 您使用的是哪个 DBMS?
  • 我正在使用 MS SSMS 2012

标签: sql sql-server sql-server-2012 greatest-n-per-group


【解决方案1】:
select * 
from 
( SELECT p.PersonKey, pn.Phone_Number, pn.Tel_NumberKey 
       , row_number() over (partition by p.PersonKey, pn.Phone_Number order by pn.Tel_NumberKey desc) rn
  FROM 
      Persons AS p 
  INNER JOIN 
      xref_Person+Telephone AS x ON p.PersonKey = x.PersonKey
  INNER JOIN 
      Telephone AS pn ON x.Tel_NumberKey = pn.Tel_NumberKey
  WHERE 
      pn.Tel_NumberType = 1 
) tt 
where tt.rn = 1  
ORDER BY 
    tt.PersonKey

【讨论】:

  • 会尝试一下,让你知道我的进展如何 - 谢谢。
【解决方案2】:

你必须使用 max() 函数,然后你必须按 rownum 降序排列。

select  f.empno 
from(select max(empno) empno from emp e 
group by rownum)f
order by rownum desc

它将为您提供从最高员工编号到最低员工编号的所有员工。现在用你的案例来实现它,然后告诉我。

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2022-09-25
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多