假设我在 SQL Server 中有一些 orderID
。每个orderID
可能有多个timestamps
,可以为null。找到不同的 orderID
的快速方法是什么
- 都有非空的
时间戳
- 最后一个
时间戳
是在昨天
示例:
今天是2018-02-08,数据如下,结果应该是OrderID 11。
OrderID | Timestamp
------------+-------------------------
11 | 2018-02-07 10:08:52.740
11 | 2018-02-06 10:08:52.740
22 | 2018-02-03 10:08:52.740
22 | 2018-02-04 10:08:52.740
33 | 2018-02-07 10:08:52.740
33 | NULL
PS:这张表大概有十亿条记录。而每个orderID
有大约3~4个时间戳。
最佳答案
虽然直接的解决方案是使用 GROUP BY/HAVING/MIN/MAX,但在处理十亿行时需要使用 WHERE:
- 查找时间戳比今天新的行 - 1
- 将它们分组并找到最大小于今天的行(这确保最近的行是昨天而不是今天)
- 对于生成的订单 ID,检查其 COUNT all = COUNT not null 时间戳
WITH cte AS (
SELECT OrderID
FROM testdata
WHERE Timestamp >= CAST(CURRENT_TIMESTAMP - 1 AS DATE)
GROUP BY OrderID
HAVING MAX(Timestamp) < CAST(CURRENT_TIMESTAMP AS DATE)
)
SELECT testdata.OrderID
FROM cte
INNER JOIN testdata ON cte.OrderID = testdata.OrderID
GROUP BY testdata.OrderID
HAVING COUNT(*) = COUNT(Timestamp)
关于sql - 在这种情况下选择不同的 orderID 的快速方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685913/