我正在尝试创建一个返回特定实体记录列表的查询,而不从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;
我很感激这个社区可以提供的任何建议。我会尽力提供所需的任何其他信息。
答案 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