限制重复会导致分组结果集而不使用distinct

时间:2013-03-12 16:48:19

标签: group-by limit distinct

我正在尝试创建一个返回特定实体记录列表的查询,而不从entityID字段返回任何重复的条目。该查询无法使用DISTINCT,因为该列表正在传递给不了解包含多于entityID的结果集的报表引擎,并且DISTINCT要求返回所有ORDER BY字段

结果集不能包含重复的实体ID,因为报告引擎也无法在同一次运行中两次处理同一实体的报告。我发现了不支持临时表的困难方法。

条目需要在查询中排序,因为报表引擎只允许在entity_header级别进行排序,我需要根据report.status进行排序。值得庆幸的是,报告引擎遵循您返回结果的顺序。

表格如下:

entity_header
=================================================
entityID(pk)    Location        active      name
1               LOCATION1       0           name1
2               LOCATION1       0           name2
3               LOCATION2       0           name3
4               LOCATION3       0           name4
5               LOCATION2       1           name5
6               LOCATION2       0           name6

report
========================================================
startdate       entityID(fk)    status      reportID(pk)
03-10-2013      1               running     1
03-12-2013      2               running     2
03-10-2013      1               stopped     3
03-10-2013      3               stopped     4
03-12-2013      4               running     5
03-10-2013      5               stopped     6
03-12-2013      6               running     7

这是我到目前为止的查询,它几乎是我需要的:

SELECT entity_header.entityID
FROM entity_header eh
INNER JOIN report r on r.entityID = eh.entityID
WHERE r.startdate between getdate()-7.5  and getdate()
AND eh.active = 0
AND eh.location in ('LOCATION1','LOCATION2')
AND r.status is not null
AND eh.name is not null 
GROUP BY eh.entityID, r.status, eh.name
ORDER BY r.status, eh.name;

我很感激这个社区可以提供的任何建议。我会尽力提供所需的任何其他信息。

1 个答案:

答案 0 :(得分:0)

以下是仅在ms SQL上运行的工作示例。

我使用rank()来计算entityID在结果中出现的次数。保存为列表。

该列表将包含entityID出现次数的整数值。

使用,其中a.list = 1 ,过滤结果。 使用 ORDER BY a.ut,a.en 对结果进行排序。 ut和en用于排序。

SELECT a.entityID FROM (
SELECT distinct TOP (100) PERCENT eh.entityID, 
     rank() over(PARTITION BY eh.entityID ORDER BY r.status, eh.name) as list,
     r.status ut, eh.name en
FROM report AS r INNER JOIN entity_header as eh ON r.entityID = eh.entityID
WHERE (r.startdate BETWEEN GETDATE() - 7.5 AND GETDATE()) AND (eh.active = 0) 
 AND (eh.location IN ('LOCATION1', 'LOCATION2'))
ORDER BY r.status, eh.name
) AS a
where a.list = 1
ORDER BY a.ut, a.en