使用TSQL SQL Server(2008 R2)有条件地选择行

Lee*_*Lee 3 sql t-sql sql-server

我一直在盯着这几个小时和几个小时,并且无法想出一个"优雅"的基于集合的方式来获得我需要的结果集...

这是我的样本数据(我的真实数据可能是1,000,000多行)......

DECLARE @t AS TABLE (ID int,ID1 nvarchar(15),[DATE] date,PERIOD int,[TYPE] nchar(1));

INSERT INTO @t (ID,ID1,[DATE],PERIOD,[TYPE])
VALUES
(1,N'NUM1','2016-01-01',1,N'B'),
(2,N'NUM1','2016-01-01',2,N'A'),
(3,N'NUM1','2016-01-01',3,N'A'),
(4,N'NUM1','2016-01-01',4,N'B'),
(5,N'NUM1','2016-01-01',4,N'A'),
(6,N'NUM1','2016-01-01',5,N'A'),

(7,N'NUM1','2016-01-02',1,N'A'),
(8,N'NUM1','2016-01-02',2,N'A'),
(9,N'NUM1','2016-01-02',3,N'A'),
(10,N'NUM1','2016-01-02',4,N'A'),
(11,N'NUM1','2016-01-02',5,N'A'),

(12,N'NUM2','2016-01-01',1,N'A'),
(13,N'NUM2','2016-01-01',1,N'B'),
(14,N'NUM2','2016-01-01',2,N'A'),
(15,N'NUM2','2016-01-01',3,N'A'),
(16,N'NUM2','2016-01-01',4,N'B'),
(17,N'NUM2','2016-01-01',4,N'A'),
(18,N'NUM2','2016-01-01',5,N'A'),

(19,N'NUM2','2016-01-02',1,N'A'),
(20,N'NUM2','2016-01-02',2,N'B'),
(21,N'NUM2','2016-01-02',3,N'A'),
(22,N'NUM2','2016-01-02',4,N'A'),
(23,N'NUM2','2016-01-02',4,N'B'),
(24,N'NUM2','2016-01-02',5,N'A');
Run Code Online (Sandbox Code Playgroud)

这是我想要得到的结果集......

1,'NUM1','2016-01-01',1,'B'
2,'NUM1','2016-01-01',2,'A'
3,'NUM1','2016-01-01',3,'A'
5,'NUM1','2016-01-01',4,'A'
6,'NUM1','2016-01-01',5,'A'

7,'NUM1','2016-01-02',1,'A'
8,'NUM1','2016-01-02',2,'A'
9,'NUM1','2016-01-02',3,'A'
10,'NUM1','2016-01-02',4,'A'
11,'NUM1','2016-01-02',5,'A'

12,'NUM2','2016-01-01',1,'A'
14,'NUM2','2016-01-01',2,'A'
15,'NUM2','2016-01-01',3,'A'
17,'NUM2','2016-01-01',4,'A'
18,'NUM2','2016-01-01',5,'A'

19,'NUM2','2016-01-02',1,'A'
20,'NUM2','2016-01-02',2,'B'
21,'NUM2','2016-01-02',3,'A'
22,'NUM2','2016-01-02',4,'A'
24,'NUM2','2016-01-02',5,'A'
Run Code Online (Sandbox Code Playgroud)

简单地说,每天有5个时期.它们可以是A型或B型.我需要获得A型.但如果没有A类型,我需要得到B类型......(当我把它写出来时听起来很简单..但是我的大脑不会提出合适的东西)

Pleeeeeease让我摆脱了痛苦......

Gio*_*sos 7

你可以使用ROW_NUMBER这个:

SELECT ID, ID1, [DATE], PERIOD, [TYPE]
FROM (
   SELECT ID, ID1, [DATE], PERIOD, [TYPE],  
          ROW_NUMBER() OVER (PARTITION BY ID1, [DATE], PERIOD 
                             ORDER BY [TYPE]) AS rn
   FROM @t) AS t
WHERE t.rn = 1
Run Code Online (Sandbox Code Playgroud)

使用ORDER BY [TYPE]OVER的条款ROW_NUMBER'A'记录在上面'B'记录.如果没有'A'给出一个记录ID1, [DATE], PERIOD,然后B记录被分配rn = 1.