使用子查询累计和后的前9个不同记录

时间:2016-05-19 07:30:49

标签: sql-server stored-procedures gridview

我有SQL数据表,其中包含以下数据结构

ID  Hrly    Hshed   Dust_removal_to_done    Dust_removal_done   Update_datetime
2   ER       MGS              4                     4             2009-05-05
3   ER       AQ               4                     2             2009-05-05
4   SR       ANDA             4                     4             2009-05-05
5   ECR      HOME             5                     5             2009-05-05
6   NR       GZB              5                     5             2009-05-05
7   NR       LDH              5                     5             2009-05-05
8   NCR      JHS              5                     5             2009-05-05
9   NCR      CNB              5                     5             2009-06-05
10  SCR      LGD              5                     5             2009-06-05
11  SCR      LGD              5                     5             2009-05-05

用户每天都会提供数据。

此外,我正在使用存储过程来累计' Dust_removal_done'如

  ALTER PROCEDURE [dbo].[RAP_regular] as

  SELECT Hshed, HRly, Dust_removal_to_done, Dust_removal_done, (SELECT SUM(Dust_removal_done) FROM TPHRAP_regular t2 
   where t2.Hshed = TPHRAP_regular.Hshed and t2.Update_datetime <= TPHRAP_regular.Update_datetime) as cumulative_dust_removal

   FROM TPHRAP_regular 

这个存储过程给我结果

Hshed       Hrly        Dust_removal_to_done    Dust_removal_done       cumulative_dust_removal 
 MGS        ER                     4                   4                    4
 AQ         ER                     4                   2                    2
 ANDA       SR                     4                   4                    4
 HOME       ECR                    5                   5                    5
 GZB        NR                     5                   5                    5
 LDH        NR                     5                   5                    5
 JHS        NCR                    5                   5                    5
 CNB        NCR                    5                   5                    5
 LGD        SCR                    5                   5                   10
 LGD        SCR                    5                   5                    5

这很好用。现在问题是只有9个Hsheds,因此我想在我的网格视图中只显示9条最新记录(唯一的Hshed和累积列)作为最终结果,这样就不会在表格中重复Hshed。怎么做到这一点?请帮忙。

1 个答案:

答案 0 :(得分:3)

您需要更改存储过程(必须在其中,因为您要丢弃其中的日期字段)。

您可以使用ROW_NUMBER()窗口功能仅过滤最新记录,如下所示:

SELECT Hshed,HRly,Dust_removal_to_done,Dust_removal_done,cumulative_dust_removal 
FROM(
      SELECT Hshed, HRly, Dust_removal_to_done, Dust_removal_done,
             (SELECT SUM(Dust_removal_done) FROM TPHRAP_regular t2 
              where t2.Hshed = TPHRAP_regular.Hshed 
               and t2.Update_datetime <= TPHRAP_regular.Update_datetime) as cumulative_dust_removal,
             ROW_NUMBER() OVER (PARTITION BY Hshed ORDER BY Update_datetime DESC) as rnk

      FROM TPHRAP_regular)
WHERE rnk = 1

编辑:您还应该使用SUM() OVER(..)作为累计金额,无需从表中选择两次:

SELECT t.Hshed,
       t.HRly,
       t.Dust_removal_to_done,
       t.Dust_removal_done,
       t.cumulative_dust_removal
  FROM (SELECT Hshed,
               HRly,
               Dust_removal_to_done,
               Dust_removal_done,
               SUM(Dust_removal_done) OVER(PARTITION BY Hshed ORDER BY Update_datetime) as cumulative_dust_removal,
               ROW_NUMBER() OVER(PARTITION BY Hshed ORDER BY Update_datetime DESC) as rnk
          FROM TPHRAP_regular) t
 WHERE t.rnk = 1