2016-11-24 8 views
0

を設定し、私のテーブルスキーマである: -のSQL SERVER:各IDに対して1つの結果、複数の結果では、以下

Appointments 
------------------------------------------------- 
|apptID| persID| apptDate| apptCode| apptConfirm| 
------------------------------------------------- 

上記の表は、これまでに作ったすべての予定を記録します。 apptCodeが "200"の場合、その人の前回の予定を取得する結果セットを取得したいと思います。

私は上記のクエリは、私の前の予定を取得しますが、私は唯一の私が知らないapptCode「200」を持つ1

に先約である1件の結果をしたい以下のクエリに

WITH selected_person AS 
(SELECT persID, apptDate FROM Appointments WHERE apptCode IN ('200')) 

SELECT apptID, apptDate, apptCode 
FROM selected_person sp LEFT JOIN Appointments ap ON sp.persID = ap.persID 
WHERE ap.apptDate < sp.apptDate 

を試してみましたこのシナリオでLIMITがどのように役立つか 任意のポインタが本当に、あなたは窓関数を各先約にインデックスを与え、その後、第一1を取ることができ、このような何か

おかげ

+0

をグループ 'によってsp.persID'、MAX(apptDate)を取得し、apptDate descで注文します。 – FDavidov

+0

SQL Server 2012で導入された遅れ/進み関数を調べることができます。もう1つの方法は、行番号を使用してnに戻ることです。 –

答えて

2

を理解されるであろう:あなたはでき

WITH selected_person AS (
    SELECT persID, apptDate FROM Appointments WHERE apptCode IN ('200') 
), previous_appointment AS (
    SELECT ap.apptID, ap.apptDate, ap.apptCode, ROW_NUMBER() OVER (PARTITION BY ap.persID ORDER BY ap.apptDate DESC) ix 
    FROM selected_person sp 
    LEFT JOIN Appointments ap ON sp.persID = ap.persID 
    WHERE ap.apptDate < sp.apptDate 
) 
SELECT apptID, apptDate, apptCode 
    FROM previous_appointment 
    WHERE ix=1; 
+0

Brilliant!これは役に立ちました: – Villie

+0

@Villie素晴らしい、フィードバックありがとう! – Lucero

+0

あなたは正しかった!私は告白します – JoDev

関連する問題