0

我正在尝试构建一个 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  

...

谢谢!

4

1 回答 1

2

也许这就是你想要做的:

;WITH x AS (SELECT id, phone_number, status, create_date,
  rn = ROW_NUMBER() OVER 
  (
    PARTITION BY phone_number 
    ORDER BY CASE [status]
      WHEN 'ANSWER' THEN 1
      WHEN 'CALLBACK' THEN 2 ELSE 3
    END, create_date)
  FROM dbo.yourtable
)
SELECT id, phone_number, status, create_date FROM x WHERE rn = 1;

SQLfiddle 演示

于 2013-10-25T19:13:54.750 回答