【问题标题】:In grouped result set, select latest row. If particular field in the latest row is 0 then select next row在分组结果集中,选择最新行。如果最新行中的特定字段为 0,则选择下一行
【发布时间】:2018-05-11 12:46:51
【问题描述】:
CREATE TABLE TableOne(Name VARCHAR(10), Val1 INT, Val2 INT, Val3 INT, RDate DATE)

INSERT TableOne VALUES ('Rec01', 0, 0, 0, '11-Nov-2017'), ('Rec02', 0, 20, 30, '10-Nov-2017'), ('Rec03', 0, 0, 0, '09-Nov-2017'), ('Rec01', 10, 20, 30, '11-Nov-2017'), ('Rec02', 10, 20 ,30, '10-Nov-2017'), ('Rec03', 0, 0, 30, '08-Nov-2017'), ('Rec01', 0, 20, 0, '10-Nov-2017'), ('Rec02', 10, 20, 0, '09-Nov-2017'), ('Rec03', 10, 0, 30, '08-Nov-2017')

一桌

 -------------------------------------------
|  Name  | Val1 | Val2 | Val3 |    RDate    |
|-------------------------------------------|
| Rec01  |   0  |   0  |   0  | 11-Nov-2017 |
| Rec02  |   0  |  20  |  30  | 10-Nov-2017 |
| Rec03  |   0  |   0  |   0  | 09-Nov-2017 |
| Rec01  |  10  |  20  |  30  | 11-Nov-2017 |
| Rec02  |  10  |  20  |  30  | 10-Nov-2017 |
| Rec03  |   0  |   0  |  30  | 08-Nov-2017 |
| Rec01  |   0  |  20  |   0  | 10-Nov-2017 |
| Rec02  |  10  |  20  |   0  | 09-Nov-2017 |
| Rec03  |  10  |   0  |  30  | 08-Nov-2017 |
 ------------------------------------------- 

这些记录必须按“名称”分组,并且需要根据以下条件选择每组的最新记录

1. If a record has two rows with same date, select first row. 
2. If a record has two rows with same date but Val1, Val2, Val3 are 0 then select next row with same date

预期结果是

 -------------------------------------------
|  Name  | Val1 | Val2 | Val3 |    RDate    |
|-------------------------------------------|
| Rec01  |  10  |  20  |  30  | 11-Nov-2017 |
| Rec02  |   0  |  20  |  30  | 10-Nov-2017 |
| Rec03  |   0  |   0  |   0  | 09-Nov-2017 |
 ------------------------------------------- 

我尝试了 ROW_NUMBER() OVER PARTITION BY

SELECT Name, Val1, Val2, Val3, RDate FROM (
SELECT Name, Val1, Val2, Val3, Max(RDate) AS RDate, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY RDate DESC) AS Rno FROM TableOne GROUP BY Name, Val1, Val2, Val3, RDate) TempTable where TempTable.rno = 1

返回

 -------------------------------------------
|  Name  | Val1 | Val2 | Val3 |    RDate    |
|-------------------------------------------|
| Rec01  |   0  |   0  |   0  | 11-Nov-2017 |
| Rec02  |   0  |  20  |  30  | 10-Nov-2017 |
| Rec03  |   0  |   0  |   0  | 09-Nov-2017 |
 ------------------------------------------- 

对于 Rec01,而不是第一行,如何选择与 Val1、Val2 和 Val3 为 0 的日期相同的下一行?

谢谢

【问题讨论】:

    标签: sql sql-server-2008 group-by row-number


    【解决方案1】:

    试试下面的查询

    SELECT  Name,Val1,Val2,Val3,RDate
    FROM    (
        SELECT  *   
            ,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY RDATE DESC
                ,(CASE WHEN Val1 +Val2 +Val3 > 0 THEN 1 ELSE 0 END) DESC) AS SlNo
        FROM    TableOne
    )   AS  T
    WHERE   T.SlNo = 1
    

    输出:-

    Name    Val1    Val2    Val3    RDate
    Rec01   10      20      30      2017-11-11
    Rec02   0       20      30      2017-11-10
    Rec03   0       0       0       2017-11-09
    

    【讨论】:

      【解决方案2】:

      如果将 val 的总和作为 case 的第二个子句添加会怎样:

      SELECT Name, Val1, Val2, Val3, RDate FROM (
      SELECT Name, Val1, Val2, Val3, Max(RDate) AS RDate, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY RDate DESC,val1+val2+val3 desc) AS Rno FROM TableOne GROUP BY Name, Val1, Val2, Val3, RDate) TempTable where TempTable.rno = 1
      

      【讨论】:

      • 它没有用。即使 Val1、Val2、Val3 不是 0,它也会返回“Rec02”的下一行而不是第一行
      猜你喜欢
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多