2017-01-09 65 views
1

我有一张表格,其中包含按客户帐户和发布月份的销售信息。发布月份是一个格式为YYMM的文本字段。我可以轻松地编写一个查询以降序的方式返回不同的发布月份,但是如何从中选择第12行?我想在最近记录的12个月前查找发布月份,理想情况下为标量子查询,以便将其用作选择标准。目前这个参数是由UDF提供的,但我怀疑子查询的性能会更好。如何在表格中找到最近的第12个日期?

+1

你可以张贴一些代码?另外,你能标记你正在使用的RDBMS吗? –

+0

ANSI SQL将'OFFSET'子句与'FETCH FIRST'结合在一起。 – jarlh

回答

2

您可以通过执行获得第12届:

select distinct month 
from t 
order by month desc 
offset 11 
fetch first 1 row only; 

这是ANSI SQL,但它不会在所有的数据库。但是,大多数数据库支持类似的功能

+0

Doooh。很简单,当我再看一遍。 SELECT MIN(PostingMonth)AS StartPeriod FROM AS X(SELECT DISTINCT TOP 12 CustomerRebateTracker01Pivot.PostingMonth FROM CustomerRebateTracker01Pivot ORDER BY CustomerRebateTracker01Pivot.PostingMonth DESC); – Dougie

0

你可以使用一个“窗口功能”,以识别12行,如下...

;WITH cteExampleData 
     (
     PostingMonth, 
     Data 
     ) 
     AS 
     (
     SELECT '1611', 'Test1' 
     UNION ALL SELECT '1612', 'Test2' 
     UNION ALL SELECT '1701', 'Test3' 
     UNION ALL SELECT '1601', 'Test4' 
     UNION ALL SELECT '1602', 'Test5' 
     UNION ALL SELECT '1604', 'Test6' 
     UNION ALL SELECT '1605', 'Test7' 
     UNION ALL SELECT '1501', 'Test8' 
     UNION ALL SELECT '1502', 'Test9' 
     UNION ALL SELECT '1503', 'Test10' 
     UNION ALL SELECT '1401', 'Test11' 
     UNION ALL SELECT '1403', 'Test12' 
     UNION ALL SELECT '1404', 'Test13' 
     UNION ALL SELECT '1405', 'Test14' 
     UNION ALL SELECT '1406', 'Test15' 
     ) 
     SELECT * 
      INTO #ExampleData 
      FROM cteExampleData; 

    ;WITH cteFind12thRow 
     AS 
     (
     SELECT RowNumber = ROW_NUMBER() OVER (ORDER BY PostingMonth), 
      * 
      FROM #ExampleData 
     ) 
     SELECT * FROM cteFind12thRow 
      WHERE RowNumber = 12 
相关问题