我正在使用“路线”表,该表详细列出了特定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选项无济于事。
答案 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