我想要条件第一和第二插入值

时间:2017-04-26 07:08:35

标签: sql sql-server-2012

abc

Consgno     Name      Entrydatetime

 111          A     01/03/2017 10:10:15
 111          A     01/03/2017 10:20:15
 111          A     01/03/2017 11:10:20
 222          B     02/03/2017 10:10:25
 333          C     06/03/2017 10:10:25
 333          C     07/03/2017 10:10:12
 444          D     04/03/2017 10:10:41
 444          D     04/03/2017 01:10:20
 444          D     06/03/2017 10:10:32
 555          E     05/04/2017 10:10:15

One Consgno不止一次进入过一次。

当一个Consgno只有一次,那么第一个值应该到来,否则第二个输入的值应该到来。

我想这样输出:

   Consgno  Name     Entrydatetime
    111      A      01/03/2017 10:20:15
    222      B      02/03/2017 11:10:36
    333      C      07/03/2017 10:10:12
    444      D      04/03/2017 01:10:20
    555      E      05/04/2017 10:10:15

2 个答案:

答案 0 :(得分:1)

您可以使用如下查询:

;WITH MyWindowedTable AS (
   SELECT Consgno, Name, Entrydatetime,
          ROW_NUMBER() OVER (PARTITION BY Consgno
                             ORDER BY Entrydatetime) AS rn,
          COUNT(*) OVER (PARTITION BY Consgno) AS cnt
FROM mytable
)
SELECT Consgno, Name, Entrydatetime
FROM MyWindowedTable
WHERE (cnt = 1 AND rn = 1) OR (cnt > 1 AND rn = 2)

使用COUNT的窗口版本:

COUNT(*) OVER (PARTITION BY Consgno)

返回每个cnt分区的填充Consgno。我们可以使用cnt来正确过滤返回的记录:在人口为1的分区中,我们获得分区的单个记录,而在其他情况下,我们得到{{1} }}

答案 1 :(得分:1)

使用ROW_NUMBER和COUNT个内置函数:

 CREATE TABLE #table1 ( Consgno INT, Name VARCHAR(1), Entrydatetime 
                         DATETIME)

 INSERT INTO #table1 ( Consgno , Name , Entrydatetime )
 SELECT 111,'A','01/03/2017 10:10:15' UNION ALL
 SELECT 111,'A','01/03/2017 10:20:15' UNION ALL
 SELECT 111,'A','01/03/2017 11:10:20' UNION ALL
 SELECT 222,'B','02/03/2017 10:10:25' UNION ALL
 SELECT 333,'C','06/03/2017 10:10:25' UNION ALL
 SELECT 333,'C','07/03/2017 10:10:12' UNION ALL
 SELECT 444,'D','04/03/2017 10:10:41' UNION ALL
 SELECT 444,'D','04/03/2017 01:10:20' UNION ALL
 SELECT 444,'D','06/03/2017 10:10:32' UNION ALL
 SELECT 555,'E','05/04/2017 10:10:15' 

 SELECT Consgno , Name , Entrydatetime 
 FROM 
 (
    SELECT Consgno , Name , Entrydatetime , ROW_NUMBER() OVER (PARTITION BY 
           Consgno ORDER BY Entrydatetime) RNo , COUNT(*) OVER (PARTITION BY 
           Consgno) AS _Count
    FROM #table1
 ) A WHERE ( RNo = 1 AND _Count = 1) OR (_Count > 1 AND RNo = 2 )