SQL 从查询结果中删除重复项
SQL remove duplicates from query results
这是我的 SQL :
SELECT * FROM unity_database.unit_uptime_daily
inner join unity_database.units on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
下面是第一部分结果的截图:
我试图只为每个具有最新日期的 unit_id 显示一个结果,所以在这个例子中,unit_id 为 30 的单位应该只显示一次,它应该是最后一行。
有什么想法吗?
WITH X AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY Unit_Id ORDER BY [Timestamp] DESC) rn
FROM unity_database.unit_uptime_daily
inner join unity_database.units
on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
)
SELECT * FROM X Where rn = 1
或
SELECT *
FROM (
SELECT *
,ROW_NUMBER() OVER (PARTITION BY Unit_Id ORDER BY [Timestamp] DESC) rn
FROM unity_database.unit_uptime_daily
inner join unity_database.units
on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
)A
WHERE rn = 1
这里有一个 MySQL 您可以考虑的解决方案:
SELECT t1.id, t1.unit_id, t1.uptime, t1.total_update, t2.timestamp
FROM
(
SELECT *
FROM unity_database.unit_uptime_daily ud1 INNER JOIN unity_database.units ud2
ON ud2.id = ud1.unit_id
WHERE ud2.location_id = 1
) t1
INNER JOIN
(
SELECT ud1.unit_id, MAX(ud1.timestamp) AS timestamp
FROM unity_database.unit_uptime_daily ud1 INNER JOIN unity_database.units ud2
ON ud2.id = ud1.unit_id
WHERE ud2.location_id = 1
GROUP BY ud1.unit_id
) t2
ON t1.unit_id = t2.unit_id AND t1.timestamp = t2.timestamp
如果这个答案能给您带来您期望的结果,请:
SELECT MAX(id) AS ID, unit_id, uptime, total_update, MAX(timestamp) as timesstamp FROM unity_database.unit_uptime_daily
inner join unity_database.units on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
GROUP BY unit_id, uptime, total_update
PS:我没有测试,但我肯定它会起作用
这是我的 SQL :
SELECT * FROM unity_database.unit_uptime_daily
inner join unity_database.units on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
下面是第一部分结果的截图:
我试图只为每个具有最新日期的 unit_id 显示一个结果,所以在这个例子中,unit_id 为 30 的单位应该只显示一次,它应该是最后一行。
有什么想法吗?
WITH X AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY Unit_Id ORDER BY [Timestamp] DESC) rn
FROM unity_database.unit_uptime_daily
inner join unity_database.units
on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
)
SELECT * FROM X Where rn = 1
或
SELECT *
FROM (
SELECT *
,ROW_NUMBER() OVER (PARTITION BY Unit_Id ORDER BY [Timestamp] DESC) rn
FROM unity_database.unit_uptime_daily
inner join unity_database.units
on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
)A
WHERE rn = 1
这里有一个 MySQL 您可以考虑的解决方案:
SELECT t1.id, t1.unit_id, t1.uptime, t1.total_update, t2.timestamp
FROM
(
SELECT *
FROM unity_database.unit_uptime_daily ud1 INNER JOIN unity_database.units ud2
ON ud2.id = ud1.unit_id
WHERE ud2.location_id = 1
) t1
INNER JOIN
(
SELECT ud1.unit_id, MAX(ud1.timestamp) AS timestamp
FROM unity_database.unit_uptime_daily ud1 INNER JOIN unity_database.units ud2
ON ud2.id = ud1.unit_id
WHERE ud2.location_id = 1
GROUP BY ud1.unit_id
) t2
ON t1.unit_id = t2.unit_id AND t1.timestamp = t2.timestamp
如果这个答案能给您带来您期望的结果,请:
SELECT MAX(id) AS ID, unit_id, uptime, total_update, MAX(timestamp) as timesstamp FROM unity_database.unit_uptime_daily
inner join unity_database.units on unity_database.units.id = unity_database.unit_uptime_daily.unit_id
where unity_database.units.location_id = 1
GROUP BY unit_id, uptime, total_update
PS:我没有测试,但我肯定它会起作用