首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用分组结果从联接中删除重复项

用分组结果从联接中删除重复项
EN

Stack Overflow用户
提问于 2019-10-31 21:30:36
回答 1查看 143关注 0票数 1

我使用带有EF Core的sql服务器。由于缺乏EF对组的支持,我运行原始sql查询。

所以,我有一张历史表

代码语言:javascript
复制
+------------+---------+------------------+
| HardwareId | StateId |    Timestamp     |
+------------+---------+------------------+
| Dev1       |       1 | 2019-10-11 11:00 |
| Dev2       |       2 | 2019-10-11 11:01 |
| Dev1       |       3 | 2019-10-11 11:09 |
| Dev2       |       1 | 2019-10-11 11:10 |
| Dev2       |       2 | 2019-10-11 11:10 |
| Dev1       |       3 | 2019-10-11 11:11 |
+------------+---------+------------------+

在这里,一些设备记录可以具有相同的时间戳。

现在我想知道每个设备的最后一个状态:

代码语言:javascript
复制
+------------+---------+------------------+
| HardwareId | StateId |    Timestamp     |
+-----==-----+---------+------------------+
| Dev2       |       1 | 2019-10-11 11:10 |
| Dev1       |       3 | 2019-10-11 11:11 |
+------------+---------+------------------+

我跑

代码语言:javascript
复制
SELECT H.TimeStamp, H.HardwareId, H.ErrorCode, SD.Description FROM History H
INNER JOIN 
(SELECT HardwareId, MAX(TimeStamp) LastDateTime from History 
GROUP BY HardwareId) AS LastStates 
ON H.TimeStamp = LastStates.LastDateTime
INNER JOIN StateDescription SD ON H.ErrorCode = SD.Id ORDER BY H.HardwareId

但是它给了我副本(由于一个给定设备的时间戳重复,一个设备的多个最后状态)。我宁愿选择这些州中的任何一个)

代码语言:javascript
复制
+------------+---------+------------------+
| HardwareId | StateId |    Timestamp     |
+------------+---------+------------------+
| Dev2       |       1 | 2019-10-11 11:10 |
| Dev2       |       2 | 2019-10-11 11:10 |
| Dev1       |       3 | 2019-10-11 11:11 |
+------------+---------+------------------+

添加不同的修复方法

代码语言:javascript
复制
SELECT DISTINCT H.TimeStamp, H.HardwareId, H.ErrorCode, SD.Description FROM History H
INNER JOIN 
(SELECT HardwareId, MAX(TimeStamp) LastDateTime from History 
GROUP BY HardwareId) AS LastStates 
ON H.TimeStamp = LastStates.LastDateTime
INNER JOIN StateDescription SD ON H.ErrorCode = SD.Id ORDER BY H.HardwareId

但是,如果我想在最终结果中添加一个记录Id (H.Id),显然会再次得到重复的结果。

代码语言:javascript
复制
  SELECT DISTINCT H.TimeStamp, H.Id, H.HardwareId, H.ErrorCode, SD.Description FROM History H
    INNER JOIN 
    (SELECT HardwareId, MAX(TimeStamp) LastDateTime from History 
    GROUP BY HardwareId) AS LastStates 
    ON H.TimeStamp = LastStates.LastDateTime
    INNER JOIN StateDescription SD ON H.ErrorCode = SD.Id ORDER BY H.HardwareId

我如何才能为每个设备获得某种顶级的记录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-31 21:32:46

我只会用row_number()

代码语言:javascript
复制
select h.*
from (select h.*,
             row_number() over (partition by HardwareId order by timestamp desc) as seqnum
      from history h
     ) h
where seqnum = 1;

这将准确地选择每台设备每天一行。如果当天有重复,它将返回任意值。如果您想要所有这些,那么使用rank()而不是row_number()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58651394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档