我遇到了麻烦。 A有一个DB,员工有多个startdates。 员工可以开始并可以在以后获得新合同。
FE。
ID NAME DATEEMPLOYED FUNCTION
1 Paul 01/01/2016 Director
2 Paul 01/01/2015 Staff Member
3 Jeff 02/05/2016 Director
4 Jeff 01/05/2015 Employee
5 Jeff 01/05/2014 Employee
6 Eric 05/06/2015 Employee
现在我需要从最新和最年轻的日期获取ID。 我想将具有最新日期的行的功能复制到最早的日期,然后删除除最旧日期之外的所有日期。
我能找到的最老的:
SELECT * FROM [database].[dbo].[Personel] t WHERE DATEEMPLOYED NOT IN (SELECT MAX(DATEEMPLOYED) AS LastUpdate FROM [database].[dbo].[Personel] GROUP BY Naam,Voornaam)
这会返回10行......
现在找到最年轻的...... 我想,将MAX(DATEEMPLOYED)改为MIN(DATEEMPLOYED)就好了......
但我想不是因为这只会返回6行......
我正在运行一个实时数据库,所以没有样本日期......
每位员工的最大日期查询的预期输出是ID 1和3 ...最小日期的预期输出是ID 2和5 ...... 没有数字6
我正在通过ASP.net应用程序运行MS SQL ... 发布的查询我正在SQL服务器上运行以进行测试... 后来我会适应ASP.Net 我想自动删除重复的员工。
我哪里出错?
答案 0 :(得分:0)
依赖于您的版本,您可以使用窗口功能
Declare @YourTable table (ID int,NAME varchar(50), DATEEMPLOYED Date, [FUNCTION] varchar(50))
Insert Into @YourTable values
(1,'Paul','01/01/2016','Director'),
(2,'Paul','01/01/2015','Staff Member'),
(3,'Jeff','02/05/2016','Director'),
(4,'Jeff','01/05/2015','Employee'),
(5,'Jeff','01/05/2014','Employee'),
(6,'Eric','05/06/2015','Employee')
;with cteBase as (
Select Distinct Name
,Times = count(*) over (Partition By Name)
,MinID = min(ID) over (Partition By Name)
,MaxID = max(ID) over (Partition By Name)
,MinDate = min(DATEEMPLOYED) over (Partition By Name Order By DATEEMPLOYED)
,MaxDate = max(DATEEMPLOYED) over (Partition By Name Order By DATEEMPLOYED Desc)
From @YourTable
)
Select * from cteBase where Times>1
返回
Name Times MinID MaxID MinDate MaxDate
Jeff 3 3 5 2014-01-05 2016-02-05
Paul 2 1 2 2015-01-01 2016-01-01
答案 1 :(得分:0)
您的数据库是否具有NULL日期,如果需要,您需要检查这些日期。