如何在SSRS表上编写过滤器,以便在重复另一个值时仅选择(ID号的)最高值?
EmpID RecordID Status
100 10001 OUT
101 10002 IN
102 10003 IN
102 10004 OUT
103 10005 IN
我有一个报告,它创建了一个可能包含重复员工id的数据集。如果员工ID相同,我希望SSRS表只选择具有较高记录ID的人。报告已经写好了,对我来说,修复这个问题最简单的方法就是在Tablix中添加一个过滤器,而不是打乱查询。
如果查询更容易修改,我也同意。下面是现有的代码。如果任何给定员工的EMPID出现不止一次…则只使用具有较大值的HID的数据行。
所发生的是这是一个web表单显示员工状态。如果员工提交更改或更新他们的日程安排,它实际上会在该表中创建一周的新行。提交表格有缺陷,但这是另一天的问题。我只需要它来读最后的编辑。HID是每次添加新行时递增的值。
选择缺席。类型,humres。fullname, humres。res_id,缺席。StartDate, DATEADD(dd, - (DATEPART(dw, Absences.StartDate) - 2), Absences.StartDate)作为每周的第一天,缺席。FreeTextField_01 AS Monday,缺席。FreeTextField_02 AS星期二,缺席。FreeTextField_03作为星期三,缺席。FreeTextField_04 AS星期四,缺席。FreeTextField_05 AS星期五,缺勤。藏,缺席时的情况。FreeTextField_01 & lt;比;'Office' AND DATENAME(weekday, GETDATE()) = 'Monday'然后缺勤。FreeTextField_01缺席时。FreeTextField_02 & lt;比;'Office' AND DATENAME(工作日,GETDATE())= '星期二'然后缺席。FreeTextField_02缺席时。FreeTextField_03 & lt;比;'Office' AND DATENAME(工作日,GETDATE())="星期三"然后缺勤。FreeTextField_03缺席。FreeTextField_04 & lt;比;'Office' AND DATENAME(工作日,GETDATE())="星期四"然后缺勤。FreeTextField_04缺席时。FreeTextField_05 & lt;比;'Office' AND DATENAME(weekday, GETDATE()) = 'Friday'然后缺勤。FreeTextField_05 ELSE " END AS Status "从humres左外连接在humres的缺席。res_id =缺勤。EmpID(humres的地方。emp_stat = 'A') AND (humres.freefield16 = 0) AND(缺勤。StartDate BETWEEN DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 0) AND DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 4)) AND (NOT (humres.)res_id IN (1,248))和(humres。emp_type = 'E') ANDblocked = 0) AND(缺勤。类型= 161)和(缺席时的情况。FreeTextField_01 & lt;比;'Office' AND DATENAME(工作日,GETDATE())="星期一",然后缺勤。FreeTextField_01缺席时。FreeTextField_02 & lt;比;'Office' AND DATENAME(工作日,GETDATE())="星期二"然后缺勤。FreeTextField_02缺席时。FreeTextField_03 & lt;比;'Office' AND DATENAME(工作日,GETDATE())="星期三"然后缺勤。FreeTextField_03缺席时。FreeTextField_04 & lt;比;'Office' AND DATENAME(工作日,GETDATE())="星期四"然后缺勤。FreeTextField_04缺席时。FreeTextField_05 & lt;比;'Office' AND DATENAME(weekday, GETDATE()) = 'Friday'然后缺勤。FreeTextField_05 ELSE " END <>")每周第一天前订货,缺勤。藏DESC
在SSRS中这样做会做更多的工作。
要在SSRS中做到这一点,您必须按EmpID分组,然后获得MAX(RecordID),然后您必须使用EmpID和MAX(RecordID)的组合键做LOOKUP
返回到相同的数据集,以获得与最后一个相匹配的状态。混乱且难以调试。
因此,如果当前查询的简单版本看起来像这样…
SELECT
EmpID, RecordID, Status
FROM myTable
你可以直接将结果转储到一个临时表中,然后进一步处理
SELECT
EmpID, RecordID, Status
INTO #t
FROM myTable
SELECT EmpID, RecordID, Status
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY EmpID ORDER BY RecordID DESC) as RowN FROM #t
) r
WHERE r.RowN = 1
这将给你想要的结果