【问题标题】:Getting distinct values from Resultset从结果集中获取不同的值
【发布时间】:2012-08-11 12:45:36
【问题描述】:

我有下表Employee和记录如下:

Eid      Ename     Phone
------------------------     
 1         A        043
 1         A        067
 2         B        073
 2         B        072
 3         C        753 
 3         C        464

到目前为止我得到了什么:

SELECT *
FROM   (SELECT Row_number() OVER (ORDER BY Eid ASC) AS rownum,
               Eid,
               Ename,
               Phone
        FROM   Employee
        WHERE  Eid IN(SELECT DISTINCT(Eid)
                      FROM   Employee
                      GROUP  BY Eid)) AS RESULTSET
WHERE  rownum BETWEEN 0 AND 3

实际上,内部查询正在返回distinct 结果,但当我在最终RESULTSET 中获得结果时,它并没有反映出来。

请告知如何获得不同的 RESULTSET。我的输出应该返回如下:

Eid      Ename     Phone
------------------------     
 1         A         043
 2         B         073
 3         C         753

【问题讨论】:

  • 获取043 而不是067 作为PhoneEid 的规则是什么?如果是“因为这是第一个”,那么您将需要考虑您的设计,因为 SQL 表中的记录没有任何内置排序。
  • 假设即使电话号码也相同,在输出中我也需要 rownum 列,我需要从结果集中获取。
  • 您需要获取备用行吗?
  • 您能否更新您的示例数据以反映这一点?

标签: java sql-server-2008 tsql sql-server-2005 teradata


【解决方案1】:

您的查询要复杂得多。尝试使用CROSS APPLY 来简化它

SELECT DISTINCT a.Eid, a.Ename, c.Phone
FROM   EMPLOYEE a
CROSS APPLY
(
  SELECT  TOP 1 ROW_NUMBER() OVER (PARTITION by Ename ORDER BY Eid ASC) AS RowNo,
          b.Eid, b.Phone
  FROM    EMPLOYEE b
  WHERE   a.EID = b.eid 
  ORDER BY RowNo ASC                         -- you can change this to DESC also
) c

我之所以加DISTINCT,是因为你自己加入了表格。

另一个更简单的版本

SELECT DISTINCT a.Eid, a.Ename, c.Phone
FROM   EMPLOYEE a
CROSS APPLY
(
  SELECT  TOP 1 b.Eid, b.Phone
  FROM    EMPLOYEE b
  WHERE   a.EID = b.eid 
) c

SQLFiddle Demo

【讨论】:

    【解决方案2】:

    如果您使用QUALIFY 子句,您可以指定您希望返回的 Row_Number 值范围。 QUALIFY 子句适用于窗口聚合函数,就像 HAVING 子句适用于非窗口聚合函数一样。

    SELECT DISTINCT
           e1.eid
         , e1.ename
         , e1.ephone
    --     , ROW_NUMBER() OVER(PARTITION BY e1.eid ORDER BY e1.eid) AS RowNum_
    FROM emp e1
    QUALIFY ROW_NUMBER() OVER(PARTITION BY e1.eid ORDER BY e1.eid) = 1
    

    如果您在结果集中包含RowNum_,那么您可以在QUALIFY 中引用它,而不是再次在ROW_NUMBER() 窗口聚合中引用它。

    【讨论】:

      【解决方案3】:

      啊,我不确定你想要这个查询的方式,但不知何故,我将它基于你的预期输出

      代码:

      select    Eid,Ename,Phone 
      from      (select ROW_NUMBER() OVER (ORDER BY Eid ASC) AS rownum,
                        Eid,
                        Ename,
                        Phone 
                 from Employee 
                 where Eid in (select distinct(Eid) 
                               from Employee  )
               ) AS RESULTSET
      Where rownum %2<>0
      

      SQLFiddle Demo

      【讨论】:

      • 表是 - Eid Ename 电话 ------------------------ 1 A 043 1 A 043 2 B 073 2 B 073 3 C 753 3 C 753 和预期的输出应该是 - rownum Eid Ename Phone ------------------------ 1 1 A 043 2 1 B 073 3 1 C 753
      【解决方案4】:

      试试这个

       SELECT * 
      FROM   (SELECT Row_number() OVER (partition by ename ORDER BY Eid ASC) AS rownum, 
                     Eid, 
                     Ename, 
                     Phone 
              FROM   Employeee
              WHERE  Eid IN(SELECT DISTINCT(Eid) 
                            FROM   Employeee
                            GROUP  BY Eid)) AS RESULTSET 
      WHERE  rownum =1
      

      【讨论】:

        【解决方案5】:

        试试这个:

         select Eid,Ename,Phone from 
         (select *,ROW_NUMBER() over(partition by Ename order by eid) as rn from emp) a
         where rn=1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-26
          • 2020-01-09
          • 2017-11-05
          • 1970-01-01
          相关资源
          最近更新 更多