sql - 在这种情况下选择不同的 orderID 的快速方法是什么?

标签 sql sql-server datetime

假设我在 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. 查找时间戳比今天新的行 - 1
  2. 将它们分组并找到最大小于今天的行(这确保最近的行是昨天而不是今天)
  3. 对于生成的订单 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/

相关文章:

sql-server - 避免从存储过程返回结果集

python - 将微秒格式化为小数点后两位(实际上是将微秒转换为几十微秒)

sql - 查找 SQL 2000 数据库中所有可为 Null 的列

sql - 如何使用 Hive 查询 3 个大表的相交值?

c# - 应用程序关闭时 SqlConnection 会自动关闭吗?

c# - 如何验证 DataGridView 输入?

python - 递归列表函数

SQL 服务器 : GROUP BY datetime without ticks

mysql - 使用内部连接和两个外部键连接两个表

sql - ALTER TABLE WHERE 子句