SQL Server:如何限制存储过程仅显示一个(下一个)匹配记录

时间:2014-02-18 12:16:58

标签: sql sql-server datetime stored-procedures

我使用以下存储过程从数据库中获取一些数据。 列meetingDate格式化为datetime,仅包含有效数据。

我如何修改存储过程以便它只显示下一个匹配记录而不是所有记录?

示例:

今天= 2014年2月18日; 数据库包含meetingDate = 20/02 / 2014,27 / 02/2014和04/03/2014的记录; 在这种情况下,结果应该只是20/02/2014的记录,作为未来的下一个匹配的记录。

我的存储过程:

ALTER PROCEDURE [dbo].[FetchMeetings]
AS
BEGIN
    SET NOCOUNT ON;
    SELECT      A.meetingID,
                CONVERT(VARCHAR(11), A.meetingDate, 106) AS meetingDate,
                A.created,
                A.createdBy,
                A.updated,
                A.updatedBy,
                B.speaker AS speaker,
                B.topic AS topic
    FROM        MeetingDates A
    INNER JOIN  MeetingDetails B
    ON          A.meetingID = B.meetingID
    WHERE       meetingDate >= GETDATE()
    ORDER BY    meetingDate, speaker, topic
    FOR XML PATH('meeting'), ELEMENTS, TYPE, ROOT('ranks')
END

非常感谢你提供任何帮助,蒂姆。

3 个答案:

答案 0 :(得分:2)

使用SELECT TOP 1

SELECT      A.meetingID,
            CONVERT(VARCHAR(11), A.meetingDate, 106) AS meetingDate,
            A.createdBy,
            B.speaker AS speaker,
            B.topic AS topic
            FROM MeetingDates A
INNER JOIN  MeetingDetails B
ON          A.meetingID = B.meetingID
            WHERE a.meetingDate IN (
SELECT      TOP 1(a.meetingDate)
FROM        MeetingDates A
WHERE       meetingDate >= GETDATE()
ORDER BY    meetingDate ASC)
ORDER BY    speaker, topic
FOR XML PATH('meeting'), ELEMENTS, TYPE, ROOT('ranks')

答案 1 :(得分:1)

使用窗口函数。它是兼容的sql server 2005 +

这是我的数据

的示例
with p as (
 select *, dense_RANK() over (order by foryear desc, formonth desc) as rnk 
from RISK_TRANS.dbo.mytable
) 

select * from p
where rnk = 2

我的钥匙是2014年 - 最后一次和2013-12; 2013-11。它只会像你期望的那样挑选我2013-12

你可以试试这个:(我不确定语法是否正确,我只做了更改,没有运行)

ALTER PROCEDURE [dbo].[FetchMeetings]
AS
BEGIN
    SET NOCOUNT ON;
    with p as (
    SELECT A.meetingID,
                CONVERT(VARCHAR(11), A.meetingDate, 106) AS meetingDate,
                A.created,
                A.createdBy,
                A.updated,
                A.updatedBy,
                B.speaker AS speaker,
                B.topic AS topic,
                DENSE_RANK() over (order by CONVERT(VARCHAR(11), A.meetingDate, 106) desc) rnk
    FROM        MeetingDates A
    INNER JOIN  MeetingDetails B
    ON          A.meetingID = B.meetingID
    WHERE       meetingDate >= GETDATE())

    select meetingid, meetingdate, createddate, createdby, updated, updatedby, speaker, topic 
    from p
    ORDER BY    meetingDate, speaker, topic
    FOR XML PATH('meeting'), ELEMENTS, TYPE, ROOT('ranks')
END

答案 2 :(得分:0)

尝试使用SELECT 1构造,请点击此处1