1

ある顧客の 2 番目の結果を表示するクエリがあります。私が今する必要があるのは、特定のリストの各顧客の 2 番目の結果を表示することです (たとえば、20 の異なる顧客 G/1931、G/1932、G/1933 など)。

どうすればいいですか?SSMS 2005 経由の SQL Server 2000

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
4

1 に答える 1

2

最も効率的な方法はcall_ref、 eachの最小値を除外し、その最小値をlink_to_client取ることだと思います:

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
            );

ROW_NUMBER私の最後のアドバイスは、 !を使用できる新しいバージョンの SQL-Server にアップグレードすることです。

SQL Fiddle の例

フィドルを提供してくれたNenad Zivkovicに感謝

于 2013-08-30T08:32:29.017 に答える