Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL:如何选择具有多个条件的行_Sql Server_Tsql_Select_Conditional Statements_Where - Fatal编程技术网

Sql server T-SQL:如何选择具有多个条件的行

Sql server T-SQL:如何选择具有多个条件的行,sql-server,tsql,select,conditional-statements,where,Sql Server,Tsql,Select,Conditional Statements,Where,我在SQL Server中设置了以下数据集,我需要按以下顺序选择具有条件的数据: 首先,检查date_end是否为1/1/2099,然后选择天数间隔最小且skill_group不是SWAT的行,因为该行具有相同的employee_id,在本例中为第2行 其次,对于没有1/1/2099日期结束的行,选择具有最近日期结束的行,在本例中为第4行 ID employee_id last_name first_name date_start date_end skill_group ---

我在SQL Server中设置了以下数据集,我需要按以下顺序选择具有条件的数据:

首先,检查date_end是否为1/1/2099,然后选择天数间隔最小且skill_group不是SWAT的行,因为该行具有相同的employee_id,在本例中为第2行

其次,对于没有1/1/2099日期结束的行,选择具有最近日期结束的行,在本例中为第4行

ID  employee_id last_name   first_name  date_start  date_end    skill_group
---------------------------------------------------------------------------
1   N05E0F  Mike    Pamela  12/19/2013  1/1/2099    SWAT
2   N05E0F  Mike    Pamela  9/16/2015   1/1/2099    Welcome Team
3   NSH8A   David   Smith   12/19/2013  9/16/2016   Unlicensed
4   NSH8A   David   Smith   8/16/2015   10/16/2016  CMT

有很多方法可以做到这一点。以下是其中一些:

版本:

select top 1 with ties
    *
  from tbl
  where skill_group != 'SWAT'
  order by 
    row_number() over (
      partition by employee_id
      order by date_end desc, datediff(day,date_start,date_end) asc 
      )
with cte as (
  select  *
      , rn = row_number() over (
              partition by employee_id
              order by date_end desc, datediff(day,date_start,date_end) asc 
            )

    from tbl
    where skill_group != 'SWAT'
)
select *
  from cte
  where rn = 1
使用版本:


谢谢你的帮助。