【问题标题】:Show second result for multiple records显示多条记录的第二个结果
【发布时间】:2013-08-30 08:08:17
【问题描述】:

我有一个查询显示一位客户的第二个结果。我现在需要做的是在特定列表中显示每个客户的第二个结果(例如 20 个不同的客户 G/1931、G/1932、G/1933 等)。

我该怎么做? Sql Server 2000 通过 SSMS 2005

1 个客户的当前查询是

SELECT TOP 1 link_to_client, call_ref
FROM
(
    SELECT TOP 2 link_to_client, call_ref
    FROM calls WITH (NOLOCK)
    WHERE link_to_client IN ('G/1931')
        AND call_type = 'PM'
    ORDER BY call_ref DESC
) x
ORDER BY call_ref

【问题讨论】:

  • call_ref 是唯一的还是重复的?如果一个link_to_client 与前2 个call_refs 具有相同的值,您需要其中一个作为结果还是下一个值?
  • 带有一些数据的fiddle 会很有帮助...

标签: sql sql-server sql-server-2000


【解决方案1】:

我认为最有效的方法是排除每个link_to_client 的最小值call_ref,然后取其最小值:

SELECT  calls.link_to_client, 
        MAX(calls.Call_Ref) call_ref
FROM    calls WITH (NOLOCK)
        LEFT JOIN 
        (   SELECT  link_to_client, MAX(Call_Ref) call_ref
            FROM    calls WITH (NOLOCK)
            WHERE   calls.call_type = 'PM'
            GROUP BY link_to_client
        ) MaxCalls
            ON MaxCalls.link_to_client = calls.link_to_client
            AND MaxCalls.Call_ref = calls.call_ref
WHERE   calls.call_type = 'PM'
AND     MaxCalls.link_to_Client IS NULL
GROUP BY calls.link_to_Client;

但是,如果您想扩展它以获取,例如每个客户的第 5 个,那么它就会开始变得混乱。在这种情况下,我会使用:

SELECT  calls.link_to_client, calls.call_ref
FROM    calls
WHERE   5 = (   SELECT  COUNT(*)
                FROM    calls c2
                WHERE   c2.link_to_Client = calls.link_to_Client
                AND     c2.call_ref <= calls.call_ref
            );

我的最后一条建议是升级到更新版本的 SQL-Server,您可以在其中使用ROW_NUMBER

Examples on SQL Fiddle

感谢Nenad Zivkovic 提供的小提琴

【讨论】:

  • ok 尝试了第一个选项,但它没有给出我所测试的 3 个客户所期望的结果。我有第四个结果,而不是第二个。
  • 实际上,刚刚重新阅读了您所说的内容,我认为我们想排除每个链接到客户端的最大 call_ref,然后取其中的最大值
  • 我已经编辑了答案以反映这一点。我错过了您订单上的DESC。对不起。
  • OK 看起来这行得通,我已经用一个客户对其进行了测试,但我忘记了我必须考虑不包括在内的 PM call_types,因此在每个 SELECT 中添加了 2 行额外的行(和 1 现在只测试 1 个客户端)AND calls.link_to_client IN ('G226BH/24') AND last_event_status IN ('RD','C') AND last_event_status NOT IN ('X') 这似乎会产生此客户端的正确结果,因此将测试更多以确保我没有错过任何其他需要省略的类型。
猜你喜欢
  • 2013-09-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多