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));
你可以使用关联子查询
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)
尝试将 ROW_NUMBER
与 PARTITION 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
输出:
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
感谢您的所有意见和帮助。我通过使用 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
我有一个名为 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));
你可以使用关联子查询
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)
尝试将 ROW_NUMBER
与 PARTITION 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
输出:
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
感谢您的所有意见和帮助。我通过使用 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