繁体   English   中英

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

[英]I want first and second inserted value with condition

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

一个Consgno已多次输入ONE。

当一个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

您可以使用如下查询:

;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)

返回每个Consgno分区的填充cnt 我们可以使用cnt正确过滤返回的记录:在人口为1的分区中,将获得该分区的单个记录,而在其余情况下,我们将获得rn = 2

使用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 ) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM