Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 如何根据当前sg选择最早日期_Sql_Sql Server - Fatal编程技术网

Sql 如何根据当前sg选择最早日期

Sql 如何根据当前sg选择最早日期,sql,sql-server,Sql,Sql Server,我需要一个SQL(SQL Server),根据当前的sg获取最早的日期。以下是样本表,其中当前sg为4-3(当前,因为结束日期为1900-01-01)。我想知道每位员工的sg实际开工日期(2015-01-01)。我真的需要一些帮助 empno position sg date_from date_to 4508 ADMIN AIDE IV 4-3 2017-01-01

我需要一个SQL(SQL Server),根据当前的sg获取最早的日期。以下是样本表,其中当前sg为4-3(当前,因为结束日期为1900-01-01)。我想知道每位员工的sg实际开工日期(2015-01-01)。我真的需要一些帮助

empno      position             sg           date_from         date_to
4508       ADMIN AIDE IV        4-3          2017-01-01        1900-01-01
4508       ADMIN AIDE IV        4-3          2016-01-01        2016-12-31
4508       ADMIN AIDE IV        4-3          2015-01-01        2015-12-31
4508       ADMIN AIDE IV        4-2          2014-01-01        2014-12-31
4508       ADMIN AIDE IV        4-2          2013-01-01        2013-12-31
1207       AIRCRAFT MECHANIC I  6-1          1988-01-01        1989-06-30
1207       AIRCRAFT MECHANIC II 8-7          2006-05-08        2015-12-31
1207       AIRCRAFT MECHANIC II 8-8          2016-01-01        1900-01-01
0889       DATA ENTRY OPERATOR  1-1          2000-12-12        2001-06-30
0889       ADMIN ASSISTANT VI   12-5         2017-03-10        1900-01-01
0889       ADMIN ASSISTANT VI   12-5         2016-01-01        2016-12-31

如果我理解正确,您可以通过内部查询实现这两种功能

select  min(date_from)
from    yourTable
where   sg = (
            select  sg
            from    yourTable
            where   date_to = '1900-01-01'
        )
还是加入

select  min(t1.date_from)
from    yourTable t1
join    yourTable t2
on      t1.sg = t2.sg
where   t2.date_to = '1900-01-01'
编辑

要获得每个职位的最短日期,最简单的方法是将第二个查询调整为:

select  t1.position, min(t1.date_from)
from    yourTable t1
join    yourTable t2
on      t1.sg = t2.sg and
        t1.position = t2.position
where   t2.date_to = '1900-01-01'
group by t1.position
编辑2

由于要求获取
empno
列中每个值的最小日期,因此您需要做的是

select  t1.empno, min(t1.date_from)
from    yourTable t1
join    yourTable t2
on      t1.sg = t2.sg and
        t1.empno = t2.empno
where   t2.date_to = '1900-01-01'
group by t1.empno

您可以在工作中看到它

如果sg不能有多个职位,您可以使用下一个查询

SELECT t.position, t.sg, MIN(date_from) AS date_from
FROM @t AS t
    INNER JOIN 
      (select sg from @t where date_to = '19000101') as cur
    ON t.sg = cur.sg
GROUP BY t.position, t.sg

请使用以下查询:

    DECLARE @t TABLE 
    (ID INT IDENTITY (1,1),position VARCHAR(20), sg VARCHAR(10),date_from DATE,date_to DATE)

    INSERT INTO @t 
    VALUES
    ('ADMIN AIDE IV','4-3','2017-01-01','1900-01-01'),
    ('ADMIN AIDE IV','4-3','2016-01-01','2016-12-31'),
    ('ADMIN AIDE IV','4-3','2015-01-01','2015-12-31'),
    ('ADMIN AIDE IV','4-2','2014-01-01','2014-12-31'),
    ('ADMIN AIDE IV','4-2','2013-01-01','2013-12-31')

    SELECT  
        MIN(t1.date_from) AS [Earliest Date]
    FROM    
        @t t1 INNER JOIN @t t2 ON t1.sg = t2.sg
    WHERE   
        t2.date_to ='1900-01-01'

解决方案:

SELECT TOP 1 *
FROM YourTableNameHere
ORDER BY Sg DESC, Date_From
更多详情:

将ORDER BY与TOP 1结合使用。下面我使用了一个临时表,可以在新的查询窗口中运行

试试这个:

CREATE TABLE #TempTable(
 Position varchar(20),
 Sg varchar(3),
 Date_From datetime,
 Date_To datetime)

INSERT INTO #TempTable (Position, Sg, Date_From, Date_To) 

SELECT 
        'ADMIN AIDE IV', '4-3', '2017-01-01', '1900-01-01'
UNION
SELECT 
        'ADMIN AIDE IV', '4-3', '2016-01-01', '2016-12-31'
UNION
SELECT 
        'ADMIN AIDE IV', '4-3', '2015-01-01', '2015-12-31'
UNION
SELECT 
        'ADMIN AIDE IV', '4-2', '2014-01-01', '2014-12-31'
UNION
SELECT 
        'ADMIN AIDE IV', '4-2', '2013-01-01', '2013-12-31'


SELECT TOP 1 *
FROM #TempTable
ORDER BY Sg DESC, Date_From

这将只返回一行,我认为OP希望每个
sg
Ya有一行,可能是这样。。。他要什么我就给他什么。也许你应该澄清一下。Thx。这对某些记录有效。我只是不明白为什么其他记录仍然是旧的sgs。0889行政助理VI 12-5 2014-01-01 0889数据输入机OP 1-1 2000-12-12 1207飞机机修工H 6-1 1979-04-01 1207飞机机修工I 6-1 1980-07-01 1207飞机机修工II 8-1 1989-01-01 1207飞机机修工II 8-7 2006-05-08 1212职员I这是查询的结果。我添加了示例雇员编号以查看每个雇员的重复记录。我看到您提供了查询结果,但您能否提供employeenum 1207的源数据。我相信这一次你也会变老。根据结果,我不明白为什么它不能按你想要的方式工作。我也没有在你的结果中看到重复记录。对于员工,我看到不同的职位有不同的sg。我注意到,当我在查询中添加员工编号时,会发生这种情况。我能阻止它吗?但我还是应该得到员工编号,这只得到一条记录。如果我有几个员工,并且我必须获得他们的sgs的最早日期,该怎么办?我如何在查询中添加员工编号而不必重复?每个员工在结果中只能有一条记录。您描述的表中没有员工编号。。。它在哪里?也许在另一张桌子上?请更新您的问题更新了我的问题,先生。