从多个表中检索的数据列中获取最后三个不同行的单独计数

时间:2014-07-21 17:46:05

标签: sql sql-server

我有一个查询,它返回通过在多个datetime上执行JOINS获得的单个列的多行数据(SQL Tables格式)。获得的数据是一个DateTime类型,现在我只想要最新三个日期的个别计数,可能是从最早到最晚排序的三个不同日期的计数。

SQL查询

SELECT  
 ST.EffectiveDate
FROM Person.Contact C
INNER JOIN Sales.SalesPerson SP
 ON C.ContactID = SP.SalesPersonID
FULL OUTER JOIN Sales.SalesTerritory ST 
 ON ST.TerritoryID = SP.TerritoryID

上面的查询返回大约200行数据,但我想要计算三个最新日期中的每一个可能是底部三个

4 个答案:

答案 0 :(得分:1)

添加了另一个查询以获取最新的3个不同日期

SELECT count(1)
FROM Person.Contact C
INNER JOIN Sales.SalesPerson SP
 ON C.ContactID = SP.SalesPersonID
FULL OUTER JOIN Sales.SalesTerritory ST 
 ON ST.TerritoryID = SP.TerritoryID
WHERE ST.effectivedate in (select distinct top 3 effectivedate 
                          from salesterritory 
                          order by effectivedate desc)

或者,如果您需要查看3个日期的计数

SELECT st.effectivedate, count(1)
FROM Person.Contact C
INNER JOIN Sales.SalesPerson SP
 ON C.ContactID = SP.SalesPersonID
FULL OUTER JOIN Sales.SalesTerritory ST 
 ON ST.TerritoryID = SP.TerritoryID
WHERE ST.effctivedate in (select distinct top 3 effectivedate 
                          from salesterritory 
                          order by effectivedate desc)
GROUP BY st.effectivedate

答案 1 :(得分:1)

您还可以使用分析RANK功能。此查询将最新日期编号为1,下一个最新日期为2,依此类推:

SELECT
  ST.EffectiveDate,
  ROW_NUMBER() OVER (ORDER BY ST.EffectiveDate DESC) AS DateRank
FROM Person.Contact C
INNER JOIN Sales.SalesPerson SP ON C.ContactID = SP.SalesPersonID
FULL OUTER JOIN Sales.SalesTerritory ST ON ST.TerritoryID = SP.TerritoryID

您不能在WHERE子句中使用排名值,因此您需要执行上面的查询并使其成为子查询或公用表表达式(CTE)。

子查询版

SELECT EffectiveDate, COUNT(*)
FROM (
  SELECT
    ST.EffectiveDate,
    ROW_NUMBER() OVER (ORDER BY ST.EffectiveDate DESC) AS DateRank
  FROM Person.Contact C
  INNER JOIN Sales.SalesPerson SP ON C.ContactID = SP.SalesPersonID
  FULL OUTER JOIN Sales.SalesTerritory ST ON ST.TerritoryID = SP.TerritoryID
) DateList
WHERE DateRank <= 3
GROUP BY EffectiveDate

CTE版

WITH DateList AS (
  SELECT
    ST.EffectiveDate,
    ROW_NUMBER() OVER (ORDER BY ST.EffectiveDate DESC) AS DateRank
  FROM Person.Contact C
  INNER JOIN Sales.SalesPerson SP ON C.ContactID = SP.SalesPersonID
  FULL OUTER JOIN Sales.SalesTerritory ST ON ST.TerritoryID = SP.TerritoryID
)
SELECT EffectiveDate, COUNT(*)
FROM DateList
WHERE DateRank <= 3
GROUP BY EffectiveDate

答案 2 :(得分:1)

如果您正在处理SQL Server 2005及更高版本,您甚至可以尝试这样做:

 ;with cte as 
 (
 SELECT  
  ST.EffectiveDate
 FROM Person.Contact C
 INNER JOIN Sales.SalesPerson SP
  ON C.ContactID = SP.SalesPersonID
 FULL OUTER JOIN Sales.SalesTerritory ST 
  ON ST.TerritoryID = SP.TerritoryID
 )
 Select EffectiveDate, count(1)
 from cte
 where EffectiveDate in (select distinct top 3 effectivedate 
                      from cte
                      order by EffectiveDate desc)
 group by EffectiveDate

虽然未经测试,但它应该有效;不过,我会不必要地详细说明。

答案 3 :(得分:1)

我会使用topgroup by执行此操作:

SELECT TOP 3 ST.EffectiveDate, COUNT(*) as cnt
FROM Person.Contact C INNER JOIN
     Sales.SalesPerson SP
     ON C.ContactID = SP.SalesPersonID FULL OUTER JOIN
     Sales.SalesTerritory ST
     ON ST.TerritoryID = SP.TerritoryID
GROUP BY ST.EffectiveDate
ORDER BY ST.EffectiveDate DESC