每天仅按用户获取最后一个条目

时间:2011-11-17 06:26:34

标签: sql-server

我正在处理一个小型报告应用程序。我有两张桌子

代理商表数据

AgentID  AgentName
-------  ---------
1001     ABC
1002     XYZ
1003     POI
1004     JKL

报告表格数据

ReportID  AgentId  Labor  Mandays  Amount  SubmitDate
--------  -------  -----  -------  ------  ----------
1         1001     30     10       5000    11/12/2011
2         1001     44     18       8000    11/14/2011
3         1002     33     75       3022    11/12/2011
4         1001     10     10       1500    11/14/2011
5         1002     10     10       1800    11/14/2011
6         1001     10     10       1400    11/14/2011
7         1003     40     40       1500    11/14/2011
8         1003     40     40       1800    11/14/2011

我想生成一个报告,为我们提供类似

的输出
ReportID  AgentId  Labor  Mandays  Amount  SubmitDate
--------  -------  -----  -------  ------  ----------
1         1001     30     10       5000    11/12/2011
3         1002     33     75       3022    11/12/2011
6         1001     10     10       1400    11/14/2011
5         1002     10     10       1800    11/14/2011
8         1003     40     40       1800    11/14/2011

先谢谢

1 个答案:

答案 0 :(得分:1)

您没有提到您正在使用的SQL Server VERSION - 如果您使用的是2005或更新版本,则可以使用{{1}的CTE(公用表表达式)功能:

ROW_NUMBER

此CTE按;WITH LastPerAgent AS ( SELECT AgentID, ReportID, Labor, Mandays, Amount, SubmitDate, ROW_NUMBER() OVER(PARTITION BY AgentID,SubmitDate ORDER BY ReportID DESC) AS 'RowNum' FROM dbo.Report ) SELECT AgentID, ReportID, Labor, Mandays, Amount, SubmitDate, FROM LastPerAgent WHERE RowNum = 1 AgentID对您的数据进行“分区”,对于每个分区,SubmitDate函数会发出序号,从1开始,按{{1}排序 - 所以每个ROW_NUMBER对的“最后一行”(最高ReportID DESC)得到ReportID,这是我在后面的SELECT语句中从CTE中选择的。

PS:这对您的输入数据不起作用100%,因为您尚未定义如何分组以及如何消除行....您可能需要根据您的要求调整此查询。 ..