使用GROUP BY和CASE pr IF或IF EXIST过滤

时间:2019-12-09 19:52:16

标签: sql sql-server database

1.0。我有一张这样的桌子:

    COD     CICLE   SCORE DATE  

    020003931   XVIII   16  Dieciseis   13/03/08    
    020003931   VIII    17  Decisiete   13/03/08    
    020003931   II  18  Dieciocho   13/03/08    
    020003931   IX  15  Quince  13/03/08    
    020003931   III 16  Dieciseis   13/03/08    
    020003931   XI  15  Quince  13/03/08    
    020003931   IV  16  Dieciseis   13/03/08    
    020003931   XII 15  Quince  13/03/08    
    020003931   VI  18  Dieciocho   13/03/08    
    020003931   XIII    15  Quince  13/03/08    
    020003931   V   18  Dieciocho   13/03/08    
    020003931   XIV 16  Dieciseis   13/03/08    

    020003931   VI  18  Dieciocho   13/03/08    
    020003931   XV  17  Decisiete   13/03/08    
    020003931   VI  17  Decisiete   13/03/08    
    020003931   VII 15  Quince  13/03/08    
    020003931   XVI 16  Dieciseis   13/03/08    
    020003931   V   16  Dieciseis   13/04/08    
    020003931   XVI 16  Dieciseis   06/04/10

    020003931   XV  16  Dieciseis   01/09/10    
    020003931   XVI 18  Dieciocho   05/10/10    
    020003931   XVII    18  Dieciocho   03/11/10    
    020003931   XVIII   17  Decisiete   31/01/11    
    020003931   XIX 16  Dieciseis   03/03/11    
    020003931   XX  17  Decisiete   04/04/11    
    020003931   XXI 15  Quince  09/05/11    
    020003931   XXII    16  Dieciseis   06/06/11    
    020003931   XXIII   17  Decisiete   08/08/11    
    020003931   XXIV    15  Quince  13/09/11    

1.1。重复项的评论是:

    V 2
    VI 3
    XV 2
    XVI 3
    XVIII 2

2.0。我需要一个没有重复记录的新表,并采用按日期排序的最新cicle的值(仅一个),如下所示:

    COD     CICLE   SCORE DATE
    020003931   II  18  Dieciocho   13/03/08    
    020003931   III 16  Dieciseis   13/03/08    
    020003931   IV  16  Dieciseis   13/03/08    
    020003931   V   16  Dieciseis   13/04/08    
    020003931   VI  18  Dieciocho   13/03/08    
    020003931   VII 15  Quince  13/03/08    
    020003931   VIII    17  Decisiete   13/03/08    
    020003931   IX  15  Quince  13/03/08    
    020003931   XI  15  Quince  13/03/08    
    020003931   XII 15  Quince  13/03/08    
    020003931   XIII    15  Quince  13/03/08    
    020003931   XIV 16  Dieciseis   13/03/08    
    020003931   XV  16  Dieciseis   01/09/10    
    020003931   XVI 18  Dieciocho   05/10/10    
    020003931   XVII    18  Dieciocho   03/11/10    
    020003931   XVIII   17  Decisiete   31/01/11    
    020003931   XIX 16  Dieciseis   03/03/11    
    020003931   XX  17  Decisiete   04/04/11    
    020003931   XXI 15  Quince  09/05/11    
    020003931   XXII    16  Dieciseis   06/06/11    
    020003931   XXIII   17  Decisiete   08/08/11    
    020003931   XXIV    15  Quince  13/09/11    

目前我有以下代码:

IF EXISTS(
        SELECT CICLO, count(CICLO) FROM CI_MATRICULA
                where codigo ='020003931' and idioma='003' and nota>15
                GROUP BY CICLO
                HAVING count(CICLO) > 1)
BEGIN
   --SELECT MAX(fecha) from ci_matricula where codigo ='020003931' and idioma='003' and nota>15
END

我试图用IF INTO IF进行查询(对于运行第I条INTO II和INTO III ...直到XXV都没有成功。

我也尝试过使用“ CASE”,但是对于索引信息来说,我认为这不是一个好主意,请使用其他替代方法或解决方案。

PS:我正在使用SQL Server Management Studio v 13.0

2 个答案:

答案 0 :(得分:1)

窗口函数ROW_NUMBER可用于计算分区上的序列号。

然后只取第一个,将滤除掉。

WITH CTE_MATRICULA AS
(
    SELECT COD, CICLE, SCORE, [DATE]
    , ROW_NUMBER() OVER (PARTITION BY COD, CICLE ORDER BY [DATE] DESC) AS RN
    FROM CI_MATRICULA
)
SELECT COD, CICLE, SCORE, [DATE]
INTO #TEMP_MATRICULA
FROM CTE_MATRICULA
WHERE RN = 1

答案 1 :(得分:0)

尽管我更喜欢使用窗口函数(请参阅@LukStorms答案)。您还可以使用相关子查询来执行此操作:

SELECT  COD, CICLE, SCORE, [DATE]
FROM CI_MATRICULA matr
WHERE [DATE]=(SELECT max([DATE]) FROM CI_MATRICULA WHERE matr.CICLE = CICLE);

与window-function选项不同,如果同一CICLE上出现多个max([DATE]),它将仍然产生重复项。窗口功能版本会随机选择一个。