选择每个ID和日期只有一行

时间:2012-07-16 14:54:20

标签: sql sql-server tsql

我需要在SQL中做一些事情,我现在很困惑!

所以我有这样的事情:

idEvent   idService   dateCreated
-------   ---------   -----------
1         1           2012-01-01
2         1           2012-02-02
3         2           2012-01-01
4         2           2012-02-02

idEvent正在自动递增。

我需要获得的是每个dateCreated DESC的最大行(按idService排序)。

所以我需要得到这个结果:

idEvent
-------
2
4

3 个答案:

答案 0 :(得分:7)

您可以使用公用表表达式将“行号”应用于每个idService / dateCreated组合。您没有指定表名,因此您必须修复它。

;WITH x AS 
(
  SELECT idEvent, idService, dateCreated, rn = ROW_NUMBER() OVER 
    (PARTITION BY idService ORDER BY dateCreated DESC)
  FROM dbo.table_something_like_this
)
SELECT idEvent, idService, dateCreated
FROM x
WHERE rn = 1;

答案 1 :(得分:0)

非常类似于Aaron,但这是主题的一个小变化。在FIDDLE HERE

create table the_table 
(
  idEvent INT,
  idService INT,
  dateCreated DATETIME
)

insert into the_table
values
 ( 1, 1, '01 JAN 2012'),
 ( 2, 1, '02 FEB 2012'),
 ( 3, 2, '01 JAN 2012'),
 ( 4, 2, '02 FEB 2012')

SELECT *
FROM 
     the_table a
    INNER JOIN 
        (
        SELECT 
          idEvent
          , rk = RANK() OVER (PARTITION BY idService ORDER BY dateCreated DESC) 
        FROM the_table 
        )b
        ON
        a.idEvent = b.idEvent
        AND b.rk= 1

答案 2 :(得分:0)

窃取了为什么theq的一些代码,我重写了它以使用group by和table变量。

   DECLARE @the_table TABLE
        (
         idEvent INT
        ,idService INT
        ,dateCreated DATETIME
        )

INSERT  INTO @the_table
VALUES  (1,1,'01 JAN 2012'),
        (2,1,'02 FEB 2012'),
        (3,2,'01 JAN 2012'),
        (4,2,'02 FEB 2012')


SELECT  MAX(idEvent)
FROM    @the_table
GROUP BY idService