2016-11-24 198 views
0

下面是我的表架构: -SQL SERVER:一个结果为多个结果每个ID设置

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

所有的约会有史以来以上表中的记录。 我想得到一个结果集,如果apptCode是“200”,那么获取该人的上一次约会。

我想下面的查询

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 

上面查询得到我以前的约会,但我只想要一个结果,这是以往获委任为其中有apptCode“200”

我不知道一个在这种情况下,LIMIT将如何提供帮助。 任何指针将是非常赞赏

感谢

+0

您可以通过'可以组sp.persID',获取MAX(apptDate),并按apptDate desc排序。 – FDavidov

+0

您可以查看SQL Server 2012中引入的滞后/潜在函数。另一个选项是使用行号并重新连接到n -1 –

回答

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

辉煌!这有助于:) – Villie

+0

@Villie很好,谢谢你的反馈! – Lucero

+0

你是对的!我承认 – JoDev