【问题标题】:Check based on columns condition in sql server根据sql server中的列条件检查
【发布时间】:2015-09-01 15:20:58
【问题描述】:

如何在 SQL Server 中解决此问题

Table: emp 

Pid  | Address           |  City | datetime                   |  Edate       | level
1    | Homeless          |  Chen | 2014-11-13  09:32:14.000   |2013-02-10    |3
1    | 3913 W. Strong    |  Chen | 2011-03-044 19:04:10.000   |2014-02-04    |7
1    | 1100 W MALLON     |  Chen | 2014-11-13  09:32:14.000   |2013-02-10    |5
2    | 610 W GARLAND #3  |  Hyd  | 2013-11-13  09:32:14.000   |2014-04-02    |4
3    | banvanu           |  chen | 2015-03-044 06:04:10.000   |2015-05-06    |6
3    | naneku            |  chen | 2015-03-044 06:04:10.000   |2015-06-09    |4

根据上表,我想要如下所示的输出

Pid  | Address           |  City | datetime                   |  Edate       | level
1    | 1100 W MALLON     |  Chen | 2014-11-13  09:32:14.000   |2013-02-10    |5
2    | 610 W GARLAND #3  |  Hyd  | 2013-11-13  09:32:14.000   |2014-04-02    |4
3    | naneku            |  chen | 2015-03-044 06:04:10.000   |2015-06-09    |4

我们需要根据以下条件从同一张表中获取地址,城市

我们获得输出的条件很少:第一级根据 pid 检查 max(datetime) 如果 max(datetime) 值对于相同的 pid 相同,那么相同的 pid 需要检查 max(edate) 如果我们再次获得相同的值然后我们需要检查 max(level) 特定患者的检索地址,该 pid 的城市

我尝试如下

select * from (select *,row_number()over(partition by id ,order by datetime,edate,level)as rno
               from emp)
where rno=1

但是上面的查询没有给出预期的结果 请告诉我如何编写查询以在 sql server 中完成此任务

【问题讨论】:

  • 如果你想要最大日期时间,最大日期,最大级别,不应该是降序排序--ROW_NUMBER() OVER (PARTITION BY PID ORDER BY datetime DESC, eDate DESC, level DESC)
  • 当您为问题添加标签时,请不要为每个版本都使用标签。只需使用通用 sql-server,如果适用,请使用特定版本的标签。

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

需要在窗口函数中使用降序:

select [Pid], [Address], [City], [datetime], [Edate], [level]
from (
  select *
       , rn= row_number() over (partition by [pid] 
                                order by [datetime] desc, 
                                         [edate]    desc, 
                                         [level]    desc
                               )
  from emp
) a
where rn = 1;

【讨论】:

【解决方案2】:

试试这个:

WITH Empgroup AS (
    SELECT
        Pid
        , [Address]
        , City
        , [DateTime]
        , EDate
        , [Level]
        , ROW_NUMBER() OVER (PARTITION BY Pid ORDER BY [DateTime] DESC, EDate DESC, [Level] DESC) AS RN
    FROM
        Emp
)
SELECT
    Pid
    , [Address]
    , City
    , [DateTime]
    , EDate
    , [Level]
FROM
    Empgroup
WHERE
    RN = 1

功能上的区别在于ROW_NUMBER() 的顺序。不过,我还选择使用公用表表达式来使查询更清晰。

【讨论】:

  • 您认为使用公用表表达式在哪些方面可以提高查询效率?我很欣赏主观上,一个普通的表格表达式可能更容易阅读,但它绝对不会对性能产生影响,这纯粹是一种美学上的改变。
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多