Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 我需要第一个和第二个插入值以及条件_Sql_Sql Server 2012 - Fatal编程技术网

Sql 我需要第一个和第二个插入值以及条件

Sql 我需要第一个和第二个插入值以及条件,sql,sql-server-2012,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

表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
一个CONGNO已多次输入一个CONGNO

当一个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(*) OVER (PARTITION BY Consgno)

返回每个
Consgno
分区的总体
cnt
。我们可以使用
cnt
正确过滤返回的记录:在填充
1
的分区中,我们得到该分区的单个记录,而在其他情况下,我们得到的是
rn=2

的记录,您可以使用如下查询:

;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(*) OVER (PARTITION BY Consgno)

返回每个
Consgno
分区的总体
cnt
。我们可以使用
cnt
正确过滤返回的记录:在填充
1
的分区中,我们得到该分区的单个记录,而在其他情况下,我们得到的是具有
rn=2

的分区使用行数和计数内置函数:

 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 ) 

使用行数和计数内置函数:

 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 ) 

您使用的是哪种RDBMS?我使用的是Mssql 2012。我认为您的示例结果不正确,或者我对您的问题有很大的误解。您的样本输入中没有关于
222 B 02/03/2017 11:10:36
您使用的是哪种RDBMS的行?我使用的是Mssql 2012我认为您的样本结果不正确,或者我对您的问题有很大的误解。
222 B 02/03/2017 11:10:36的示例输入中没有行