如何选择某些日期参数之间的第一个和最后一个记录?

时间:2013-03-22 08:26:42

标签: tsql

我需要一个Query来提取日期参数之间的第一个实例和最后一个实例 我有一个表记录财务信息,其中financialyearenddate字段通过Company链接到companyID表。每个公司也链接到programme表,可以有多个程序。我有一份报告来为每家公司提取财务资金 在某些程序中,我已调整为仅拉动第一个和最后一个实例(使用MIN& MAX)但是我需要第一个实例。 在某个日期参数和特定日期参数之前的最后一个实例之后。

示例:公司ABloggs的财务状况为1999,2000,2001,2004,2006,2007,2009,但该计划从2001年到2007年进行,所以我只想要 这些年份之间的第一份财务记录和最后一次财务记录,即2001年和2007年的记录。任何帮助赞赏。 目前我正在使用2个查询,因为我急需数据,但我需要在1个查询中,并且仅在财务年度结束日期在参数之间且仅在公司最少有2个GVA记录的情况下。

查询1

SELECT 
    gva.ccx_companyname, 
    gva.ccx_depreciation, 
    gva.ccx_exportturnover, 
    gva.ccx_financialyearenddate, 
    gva.ccx_netprofitbeforetax, 
    gva.ccx_totalturnover, 
    gva.ccx_totalwages, 
    gva.ccx_statusname, 
    gva.ccx_status, 
    gva.ccx_company, 
    gva.ccx_totalwages + gva.ccx_netprofitbeforetax + gva.ccx_depreciation AS GVA, 
    gva.ccx_nofulltimeequivalentemployees
FROM 
    (
        SELECT
            ccx_companyname, 
            MAX(ccx_financialyearenddate) AS LatestDate
        FROM Filteredccx_gva AS Filteredccx_gva_1
        GROUP BY ccx_companyname
    ) AS min_1 
INNER JOIN Filteredccx_gva AS gva 
    ON min_1.ccx_companyname = gva.ccx_companyname AND 
       min_1.LatestDate = gva.ccx_financialyearenddate
WHERE (gva.ccx_status = ACTUAL)

QUERY2:

SELECT 
    gva.ccx_companyname, 
    gva.ccx_depreciation, 
    gva.ccx_exportturnover,
    gva.ccx_financialyearenddate, 
    gva.ccx_netprofitbeforetax, 
    gva.ccx_totalturnover,
    gva.ccx_totalwages, 
    gva.ccx_statusname, 
    gva.ccx_status, 
    gva.ccx_company, 
    gva.ccx_totalwages + gva.ccx_netprofitbeforetax + gva.ccx_depreciation AS GVA, 
    gva.ccx_nofulltimeequivalentemployees
FROM 
    (
         SELECT
             ccx_companyname, 
             MIN(ccx_financialyearenddate) AS FirstDate
         FROM Filteredccx_gva AS Filteredccx_gva_1
         GROUP BY ccx_companyname
    ) AS MAX_1 
INNER JOIN Filteredccx_gva AS gva 
    ON MAX_1.ccx_companyname = gva.ccx_companyname AND 
       MAX_1.FirstDate = gva.ccx_financialyearenddate
WHERE (gva.ccx_status = ACTUAL)

3 个答案:

答案 0 :(得分:0)

您不能只使用第一个和最后一个日期参数添加where子句。像这样:

SELECT <companyId>, MIN(<date>), MAX(<date>)
FROM <table>
WHERE <date> BETWEEN @firstDate AND @lastDate
GROUP BY <companyId>

答案 1 :(得分:0)

declare @programme table (ccx_companyname varchar(max), start_year int, end_year int);
insert @programme values
('ABloggs', 2001, 2007);

declare @companies table (ccx_companyname varchar(max), ccx_financialyearenddate int);
insert @companies values
 ('ABloggs', 1999)
,('ABloggs', 2000)
,('ABloggs', 2001)
,('ABloggs', 2004)
,('ABloggs', 2006)
,('ABloggs', 2007)
,('ABloggs', 2009);

select c.ccx_companyname, min(ccx_financialyearenddate), max(ccx_financialyearenddate)
from @companies c
join @programme p on c.ccx_companyname = p.ccx_companyname
where c.ccx_financialyearenddate >= p.start_year and c.ccx_financialyearenddate <= p.end_year
group by c.ccx_companyname
having count(*) > 1;

答案 2 :(得分:0)

您可以将两个原始查询合并到一个查询中,方法是在虚拟表的同一GROUP BY查询中包含MIN和MAX聚合。还包括COUNT()和HAVING COUNT()&gt; 1确保公司必须至少有2个日期。因此查询应如下所示:

SELECT 
    gva.ccx_companyname, 
    gva.ccx_depreciation, 
    gva.ccx_exportturnover,
    gva.ccx_financialyearenddate, 
    gva.ccx_netprofitbeforetax, 
    gva.ccx_totalturnover,
    gva.ccx_totalwages, 
    gva.ccx_statusname, 
    gva.ccx_status, 
    gva.ccx_company, 
    gva.ccx_totalwages + gva.ccx_netprofitbeforetax + gva.ccx_depreciation AS GVA, 
    gva.ccx_nofulltimeequivalentemployees
FROM 
    (SELECT
         ccx_companyname,
         ccx_status,
         MIN(ccx_financialyearenddate) AS FirstDate,
         MAX(ccx_financialyearenddate) AS LastDate,
         COUNT(*) AS NumDates
     FROM Filteredccx_gva AS Filteredccx_gva_1
     WHERE (ccx_status = ACTUAL)
     GROUP BY ccx_companyname, ccx_status
     HAVING COUNT(*) > 1
    ) AS MinMax
INNER JOIN Filteredccx_gva AS gva 
      ON MinMax.ccx_companyname = gva.ccx_companyname AND 
         (MinMax.FirstDate = gva.ccx_financialyearenddate OR
          MinMax.LastDate = gva.ccx_financialyearenddate)
WHERE (gva.ccx_status = MinMax.ccx_status)
ORDER BY gva.ccx_companyname, gva.ccx_financialyearenddate