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
答案 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])
,它将仍然产生重复项。窗口功能版本会随机选择一个。