如何选择数据集的第1个,第2个,第3个和第3个?

时间:2018-10-26 14:34:38

标签: tsql

我有一个查询,该查询按区域返回位置列表,该区域在查询中作为子句运行。问题是,我需要将位置列表分成三个单独的部分,以便可以对这三个组中的每一个运行主查询。例如,区域1返回15个位置的计数。我想获取前5个,运行我的报告,然后获取第二个5,运行我的报告,最后获取最后5个并运行我的报告。这必须是动态的,因为要添加或删除新位置。

SELECT
    tExceptionsAll1.ID,
    tExceptionsAll1.CardholderName,
    PCARDS_ILL_DBO_CARD.PERSON_ID,
    tExceptionsAll1.CardType, 
    tExceptionsAll1.Duration,
    tExceptionsAll1.ExceptionType,
    tExceptionsAll1.STL AS [Exp STL],
    tExceptionsAll1.CL AS [Exp CL], 
    tExceptionsAll1.TempSTL As [Exp TempSTL],
    tExceptionsAll1.TempCL As [Exp TempCL],
    PCARDS_ILL_DBO_CARD.TRANS_LIMIT_AMT AS [Card STL],
    PCARDS_ILL_DBO_CARD.MONTH_LIMIT_AMT AS [Card CL], 
    tExceptionsAll1.TerminationDate,
    tExceptionsAll1.DCMNames,
    tExceptionsAll1.ReminderDate
FROM PCARDS_ILL_DBO_CARD
INNER JOIN tExceptionsAll1 
ON PCARDS_ILL_DBO_CARD.CARD_ID = CLNG(tExceptionsAll1.CardID) 
AND CLNG(PCARDS_ILL_DBO_CARD.PERSON_ID) = tExceptionsAll1.CardholderUIN
WHERE
    (tExceptionsAll1.STL > 0 AND
    tExceptionsAll1.CL  > 0 AND
    PCARDS_ILL_DBO_CARD.TRANS_LIMIT_AMT <> tExceptionsAll1.STL AND
    PCARDS_ILL_DBO_CARD.MONTH_LIMIT_AMT <> tExceptionsAll1.CL  AND
    tExceptionsAll1.TerminationDate IS NULL)
    OR 
    (tExceptionsAll1.TempSTL > 0 AND
    tExceptionsAll1.TempCL  > 0 AND
    PCARDS_ILL_DBO_CARD.TRANS_LIMIT_AMT <> tExceptionsAll1.TempSTL AND
    PCARDS_ILL_DBO_CARD.MONTH_LIMIT_AMT <> tExceptionsAll1.TempCL AND
    tExceptionsAll1.TerminationDate IS NULL AND
    tExceptionsAll1.Duration like 'One-Time' AND
    tExceptionsAll1.ReminderDate < date());

我需要返回前5个位置,然后返回第二个位置(在本例中为4个)。

2 个答案:

答案 0 :(得分:1)

您可以考虑使用NTILE()函数吗?

答案 1 :(得分:0)

李, 使用OFFSETFETCH之后,您可以完成自己的工作。例如:

DECLARE @Divisor int = 3
DECLARE @PartNo int = 3
DECLARE @Total int = (SELECT COUNT(*) FROM IR_Doc_Ref)
DECLARE @SegLength int = @Total/@Divisor
DECLARE @Skip int = (@PartNo - 1) * @SegLength
DECLARE @Take int = @SegLength

SELECT * FROM Zones
ORDER BY ID --Any row will do here.
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY

当然,这假设您的记录数可以被除数平均除。如果不是,则需要合并模数(%)运算符。希望这会有所帮助。