在单列上过滤SELECT结果

时间:2019-03-16 13:14:28

标签: sql group-by

我正在使用“路线”表,该表详细列出了特定ProductID的一组“阶段”:

from shutil import copy

还有一个Records表,其中详细列出了在特定阶段产品序列号带有时间戳的PASS / FAIL结果:

| ID | ProductID | StageID | Order |
|----+-----------+---------+-------|
|  0 |         1 |       4 |     1 |
|  1 |         1 |       2 |     2 |
|  2 |         1 |       3 |     3 |
|  3 |         1 |       7 |     4 |
|  4 |         1 |       5 |     5 |
|----+-----------+---------+-------|

从上面的假设数据中可以看到,序列号G001已通过阶段4,通过,然后是阶段2和通过,但是又再次通过阶段2和失败。

现在,我想从此记录表中为特定序列号选择结果,其中该产品的路由中存在StageID。 很简单-这是我的查询:

| ID | RecordDate          | Serial Number | StageID | Result |
|----+---------------------+---------------+---------+--------|
|  0 | 2019-03-16 00:00:00 | G001          |       4 |      1 |
|  1 | 2019-03-16 00:01:00 | G001          |       2 |      1 |
|  2 | 2019-03-16 00:02:00 | G001          |       2 |      0 |
|----+---------------------+---------------+---------+--------|

对于以上数据,这给了我

SELECT StageID, Result, RecordDate
FROM Records
WHERE StageID IN (SELECT StageID FROM Route WHERE ProductID = 1) AND SerialNumber = 'G001';

现在,不幸的是,我对SQL的了解消失了,这是我想对StageID进行过滤的一个复杂问题,因此,在Records表中,对于该StageID和SerialNumber仅显示最新的 recent 结果。因此,在给定的示例中,我想要这样做:

| StageID | Result | RecordDate          |
|---------+--------+---------------------|
|       4 |      1 | 2019-03-16 00:00:00 |
|       2 |      1 | 2019-03-16 00:00:01 |
|       2 |      0 | 2019-03-16 00:00:02 |
|---------+--------+---------------------|

可以在RecordDate上或更简单地在Records.ID上进行过滤。

但是我无法弄清楚能够实现此目标的SQL,我认为这是我对这种语言的了解不足以阐明我要执行的操作的情况。

所以我的问题是:是否可以在每个StageID的最新记录中过滤这些结果?

我使用GROUP BY选项无济于事。

2 个答案:

答案 0 :(得分:1)

使用窗口功能:

[0, 1, 2, 1, 2, 1, 0, -1]

或者,您可以添加

SELECT r.StageID, r.Result, r.RecordDate
FROM (SELECT r.*
             ROW_NUMBER() OVER (PARTITION BY r.StageID ORDER BY r.RecordDate DESC) as seqnum
       FROM Records r
     ) JOIN
     Route ro
     ON ro.StageID = r.StageID AND ro.ProductId = 1
WHERE r.SerialNumber = 'G001';

答案 1 :(得分:0)

WITH cte 
     AS (SELECT StageID, 
                Result, 
                RecordDate, 
                Row_number() 
                  OVER( 
                    partition BY StageID 
                    ORDER BY Record_Date DESC) AS rn 
         FROM   table) 
SELECT StageID, 
       Result, 
       RecordDate 
FROM   cte 
WHERE  rn = 1 
ORDER  BY StageID DESC