SQL Server中的QUALIFY类功能

Ada*_*dam 2 sql-server sql-server-2008

我的表格有2列:Emp_NameEmp_NR

一个Emp_Name值可能具有2个不同的Emp_NR值。

我想创建一个SELECT仅获取Emp_Name和的单个值的语句Emp_NR

该语句应类似于Teradata中的内容:

SELECT 
    Emp_Name,
    Emp_NR
FROM Table
QUALIFY Row_Number OVER (PARTITION BY Emp_Name ORDER BY Emp__NR DESC) = 1
Run Code Online (Sandbox Code Playgroud)

除此之外,我还想获得Emp_NR分配给特定的最高价Emp_Name

Luk*_*zda 14

另一种方法是ORDER BY结合使用TOP 1 WITH TIES

SELECT TOP 1 WITH TIES Emp_Name, Emp_NR
FROM Table
ORDER BY ROW_NUMBER() OVER (PARTITION BY Emp_Name ORDER BY Emp_NR DESC);
Run Code Online (Sandbox Code Playgroud)

性能可能比使用子查询的解决方案稍差。

  • 这实际上是所提出问题的确切答案,该问题正在 SQL Server 中寻找与“QUALIFY”等效的内容。 (2认同)
  • @SimeonPilgrim `ROW_NUMBER = 1 只会给你一行,你的WITH TIES 与 RANK() = 1 相同,而不是 ROW_NUMBER。` 获取每个分区第一行的整个线索是使用 `WITH TIES ` 条款。该解决方案必须适用于所有分区。这里是具体示例:https://dbfiddle.uk/uBadBmSP (2认同)

Eva*_*kas 5

你做得对。

SELECT Emp_NR, Emp_Name
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY Emp_Name ORDER BY Emp_NR DESC) AS RN, Emp_Name, Emp_NR
    FROM YourTable
    ) AS T
WHERE T.RN = 1;
Run Code Online (Sandbox Code Playgroud)

这是正确的语法。