繁体   English   中英

SQL Server 2008按唯一值获取最后一行

[英]SQL Server 2008 get last row by unique value

我有一个名称为Events的SQL Server 2008数据库。 我只想从RadioNumber获取所有最后一个条目。

我的SQL如下:

SELECT 
    MAX(timestamp) AS TimeStamp,
    RadioNumber,
    info,
    RadioNumberInfo,
    success
FROM
    (SELECT TOP 100 PERCENT *
     FROM Events
     WHERE Type = 1
       AND (Info IN (SELECT '1 Frei Funk' FROM Events)
            OR Info IN (SELECT '2 Frei Wache' FROM Events)
            OR Info IN (SELECT '3 Ausgerückt' FROM Events)
            OR Info IN (SELECT '5 Sprechwunsch' FROM Events)
            OR Info IN (SELECT '7 Patient aufg' FROM Events)
            OR Info IN (SELECT '8 Am Transportziel' FROM Events))) AS tmp
GROUP BY 
    tmp.RadioNumber, tmp.Info, tmp.RadioNumberInfo, tmp.Success
ORDER BY 
    Timestamp DESC

结果看起来像这样,红色框的行是我要显示的行。

在此处输入图片说明

我必须改变什么才能显示出来?

最简单的方法可能是:

select top (1) with ties . . .
. . .
order by row_number() over (partition by tmp.RadioNumber order by Max(timestamp));

尝试将ROW_NUMBERPARTITION BY一起使用:

SELECT
q.*
FROM
(
    SELECT 
      MAX(timestamp) AS TimeStamp
    , RadioNumber
    , info
    , RadioNumberInfo
    , success
    , ROW_NUMBER() OVER (PARTITION BY RadioNumber ORDER BY MAX(timestamp) RN
    FROM
    (
        SELECT TOP 100 PERCENT *
        FROM Events
        WHERE Type = 1
        AND (Info IN (SELECT '1 Frei Funk' FROM Events)
            OR Info IN (SELECT '2 Frei Wache' FROM Events)
            OR Info IN (SELECT '3 Ausgerückt' FROM Events)
            OR Info IN (SELECT '5 Sprechwunsch' FROM Events)
            OR Info IN (SELECT '7 Patient aufg' FROM Events)
            OR Info IN (SELECT '8 Am Transportziel' FROM Events))
    ) AS tmp
    GROUP BY tmp.RadioNumber, tmp.Info, tmp.RadioNumberInfo, tmp.Success
 )q
 WHERE q.RN = 1

还有一个具有相似数据的示例:

DECLARE @table TABLE
(
    FooStamp DATETIME,
    RadioNumber INT,
    Info VARCHAR(50),
    Success tinyint
)

INSERT INTO @table
(
    FooStamp,
    RadioNumber,
    Info,
    Success
)
VALUES
(
    '2019-03-10 00:27:30', -- FooStamp - DATETIME
    1, -- RadioNumber - INT
    'Info 1', -- Info - VARCHAR
    1 -- Success - tinyint
)
, ('2019-03-10 00:27:31', 1, 'Info 1', 1)
, ('2019-03-10 00:27:32', 1, 'Info 1', 1)
, ('2019-03-10 00:27:33', 1, 'Info 2', 1)
, ('2019-03-10 00:28:38', 2, 'Info 2', 1)
, ('2019-03-10 00:29:38', 3, 'Info 3', 1)

并查询:

SELECT 
q.*
FROM
(
SELECT 
  MAX(t.FooStamp) MaxFooStamp
, t.RadioNumber 
, t.Info
, t.Success
, ROW_NUMBER() OVER (PARTITION BY t.RadioNumber ORDER BY MAX(t.FooStamp)) RN
FROM @table t
GROUP BY   t.RadioNumber
         , t.Info
         , t.Success
)q
WHERE q.RN = 1

OUTPUT:

MaxFooStamp                 RadioNumber    Info   Success   RN
2019-10-03 00:27:32.000          1         Info1     1       1
2019-10-03 00:28:38.000          2         Info2     1       1
2019-10-03 00:29:38.000          3         Info3     1       1

您可以使用相关子查询

SELECT timestamp AS TimeStamp,
       RadioNumber,
       info,
       RadioNumberInfo,
       success
FROM   (SELECT TOP 100 PERCENT *
        FROM   Events
        WHERE  Type = 1
               AND ( Info IN (SELECT '1 Frei Funk'
                              FROM   Events)
                      OR Info IN (SELECT '2 Frei Wache'
                                  FROM   Events)
                      OR Info IN (SELECT '3 Ausgerückt'
                                  FROM   Events)
                      OR Info IN (SELECT '5 Sprechwunsch'
                                  FROM   Events)
                      OR Info IN (SELECT '7 Patient aufg'
                                  FROM   Events)
                      OR Info IN (SELECT '8 Am Transportziel'
                                  FROM   Events) )) AS tmp
where timestamp in (select max(timestamp) from 
FROM   Events
        WHERE  Type = 1
               AND ( Info IN (SELECT '1 Frei Funk'
                              FROM   Events)
                      OR Info IN (SELECT '2 Frei Wache'
                                  FROM   Events)
                      OR Info IN (SELECT '3 Ausgerückt'
                                  FROM   Events)
                      OR Info IN (SELECT '5 Sprechwunsch'
                                  FROM   Events)
                      OR Info IN (SELECT '7 Patient aufg'
                                  FROM   Events)
                      OR Info IN (SELECT '8 Am Transportziel'
                                  FROM   Events) )) tmp1 where radionumber=tmp1.radionumber)

感谢您的所有意见和帮助。 我发现使用join会有一点帮助。

SELECT a.* 
FROM Events AS a 
INNER JOIN (
    SELECT MAX(a.ID) AS ID, MAX(a.TimeStamp) AS TimeStamp, a.RadioNumber 
    FROM Events AS a 
    WHERE a.Type = 1 
    AND a.Info IN ('1 Frei Funk','2 Frei Wache','3 Ausgerückt','5 Sprechwunsch','7 Patient aufg','8 Am Transportziel') 
GROUP BY a.RadioNumber
) AS b ON b.ID = a.ID 
ORDER BY b.TimeStamp DESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM