根据上次修改状态选择记录

时间:2012-06-22 07:34:04

标签: sql greatest-n-per-group

我有下表

fieldid  STATUS  CreatedWhen

122      Down    2012-05-16 14:26:56.263
122      Down    2012-05-16 14:26:56.250
122      Down    2012-05-16 14:26:56.233
122      Down    2012-05-16 14:26:56.217
122      Up      2012-05-16 14:26:56.200
54       Up      2011-10-07 10:19:33.873

我想只选择那些最新状态为Up的字段,结果应该只是最后一行,因为fieldid:122的最新状态为'Down'。只有在状态有效时才能获得最大日期。

编辑:sql server 2008

4 个答案:

答案 0 :(得分:10)

不确定您使用的是哪个DBMS,但未指明,但这是一个与DBMS无关的解决方案,无论您使用的是哪个DBMS,它都应该有效:

SELECT
    a.fieldid
FROM
    (
        SELECT fieldid, MAX(CreatedWhen) AS maxdate
        FROM tbl
        GROUP BY fieldid
    ) a
INNER JOIN
    tbl b ON 
        a.fieldid = b.fieldid AND
        b.CreatedWhen = a.maxdate AND
        b.STATUS = 'Up'

答案 1 :(得分:0)

很难看到所有要求。也许这就是你的意思?

SELECT fieldid, max(CreatedWhen)
FROM <youtable>
WHERE field_id not in (
  -- exclude any field that has at least one 'Down'
  SELECT DISTINCT fieldid
  FROM <yourtable>
  WHERE STATUS='Down'
)
GROUP BY fieldid

答案 2 :(得分:0)

SELECT TOP 1 * FROM MyTbl
WHERE Status = 'Up'
ORDER BY CreatedWhen DESC

答案 3 :(得分:0)

如果您使用的是SQL Server,请尝试

SELECT TOP 1 *
FROM <TABLE>
WHERE 
    STATUS = 'Up'
ORDER BY
    CreatedWhen DESC

详情: TOP 1:只选择结果集的第一行 where子句只选择Status ='Up'的行 订单通过定义结果集的顺序。在这种情况下,DESC代表较新的行之前的旧行。所以第一个将是最后创建的