我正在尝试构建一个 SQL Server 查询,它将在一个包含数百万行的表中查找一组特定的值,如果它不存在,则返回最新的值。
假设我们有这张表:
id | phone_number | status | create_date
---|-------------- | -------- | ---------------
1 | 123-123-1234 | ANSWER | xxx
2 | 123-123-1234 | MACHINE | xxx
3 | 123-123-1234 | HANGUP | xxx
4 | 123-123-1234 | CALLBACK | xxx
每笔交易都是一行。
我需要查找特定日期范围内的所有数字,如果 phone_number 在一组值中具有特定状态,则返回该 id,如果不是返回最新的 id。但每个电话号码只有一条记录
我知道语法是错误的,但我想会更好地解释我的想法。
SELECT * FROM transactions t
WHERE create_date = '2013-10-10' AND
(id = (
SELECT MAX(id) FROM transactions
WHERE t.phone_number = phone_number AND status IN ('ANSWER','CALLBACK')
) OR (
SELECT MAX(id) FROM transactions
WHERE t.phone_number = phone_number
)
如果在时间范围内存在 ANSWER 状态,则从该号码返回具有该状态的最新 ID,如果没有,则返回 CALLBACK,如果没有任何其他状态。这适用于所有电话号码。
我会期待这样的结果:
id | phone_number | status | create_date
-- | ------------ | -------- | ----------
1 | 123-123-1234 | ANSWER | xxx
20 | 321-321-3210 | HANGUP | xxx
30 | 123-312-2310 | CALLBACK | xxx
...
谢谢!