Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取组中最近的processdate?_Sql_Sql Server - Fatal编程技术网

Sql 如何获取组中最近的processdate?

Sql 如何获取组中最近的processdate?,sql,sql-server,Sql,Sql Server,我想使用acct.processdate获取每月最新的条目。我尝试过使用MAX函数,但它没有帮助,因为我使用的是groupby。我该怎么做呢 DECLARE @StartDate AS INT , @EndDate AS int SET @StartDate = '20190131' SET @EndDate = '20191130' SELECT count(*) as [Account Count] , datename(MONTH, CAST(CAST(

我想使用acct.processdate获取每月最新的条目。我尝试过使用MAX函数,但它没有帮助,因为我使用的是groupby。我该怎么做呢

DECLARE @StartDate AS INT
        , @EndDate AS int

SET @StartDate = '20190131'
SET @EndDate = '20191130'

SELECT count(*) as [Account Count]
        , datename(MONTH, CAST(CAST(ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) AS [Month Name]
        , (CAST(CAST(acct.ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) AS [Process Date]

from ARCUSYM000.dbo.ACCOUNT acct

where acct.CLOSEDATE is null AND 
 (acct.ProcessDate >= @StartDate
    AND acct.ProcessDate <= @EndDate)
GROUP BY acct.ProcessDate
ORDER BY (CAST(CAST(acct.ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) desc
这是我目前的结果:

这是我想要的结果:

CTE的新结果:


您可以将结果放入cte并使用not exists函数

DECLARE @StartDate AS INT
        , @EndDate AS int

SET @StartDate = '20190131'
SET @EndDate = '20191130'

;with cte as
(
SELECT count(*) as [Account Count]
        , datename(MONTH, CAST(CAST(ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) AS [Month Name]
        , (CAST(CAST(acct.ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) AS [Process Date]

from ARCUSYM000.dbo.ACCOUNT acct

where acct.CLOSEDATE is null AND 
 (acct.ProcessDate >= @StartDate
    AND acct.ProcessDate <= @EndDate)
GROUP BY acct.ProcessDate
)
select * from cte a
where not exists(select 1 from cte b where a.[Month Name] = b.[Month Name] and 
a.[Process Date] < b.[Process Date] )

使用CTE时,以下各项应起作用。其概念是按月份和maxdate分组,最后将表本身连接起来。GROUPBY的行将充当用于联接的复合键

确保将startdate和enddate变量声明为日期类型,否则BETWEEN函数将失败。 还请注意,由于group by只处理月份名称,因此包含一年多以前的数据可能会导致意外结果。在这种情况下,我将使用YEAR函数添加一个YEAR列,我可以将其包含在GROUPBY子句中

DECLARE @StartDate AS date -- Define these as dates
       , @EndDate AS date

SET @StartDate = '20190131'
SET @EndDate = '20191130'


;WITH accountCounts AS -- Original Data
(
    SELECT count(*) as [Account Count]
    , datename(MONTH, CAST(CAST(ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) AS [Month Name]
    , (CAST(CAST(acct.ProcessDate AS VARCHAR(10)) AS SMALLDATETIME)) AS [Process Date]
    FROM ARCUSYM000.dbo.ACCOUNT acct
),
accountCountsDateFiltered AS -- Filtered on date 
(
        SELECT * FROM accountCounts
        WHERE [Process Date] BETWEEN @StartDate AND @EndDate
),
accountCountGrouped AS -- Grouped without the account count
(
    SELECT AC.[Month Name], MAX(AC.[Process Date]) as [Process Date] 
    FROM accountCountsDateFiltered AC
    GROUP BY [Month Name] --Note: Going back another year may group this years Month with last years
)
--  Adds account count column by joining to itself on both columns.
SELECT DF.[Account Count], DF.[Month Name], DF.[Process Date] 
FROM accountCountGrouped AG 
JOIN accountCountsDateFiltered DF ON DF.[Month Name] = AG.[Month Name] AND DF.[Process Date] = AG.[Process Date]

您可以使用ROW_NUMBER查找具有子查询的单个行,并选择最新/最早的行

declare @ARCUSYM000_dbo_ACCOUNT table
        (ProcessDate    datetime,
        CLOSEDATE       datetime)

insert  @ARCUSYM000_dbo_ACCOUNT
values  ('20190201', '20190228'),
        ('20190201', null),
        ('20190201', null),
        ('20190202', null),
        ('20190202', null),
        ('20190202', '20190228'),
        ('20190202', null),
        ('20190203', null),
        ('20190203', null),
        ('20190203', null),
        ('20190204', null),
        ('20190204', null),
        ('20190204', null),
        ('20190204', '20190228'),
        ('20190301', '20190331'),
        ('20190302', null),
        ('20190303', null),
        ('20190303', '20190331'),
        ('20190303', null),
        ('20190304', null),
        ('20190305', null),
        ('20190305', '20190331'),
        ('20190305', null),
        ('20190305', '20190331'),
        ('20190305', null),
        ('20190305', '20190331'),
        ('20190305', null),
        ('20190401', null)

-- select * from @ARCUSYM000_dbo_ACCOUNT

DECLARE @StartDate date
        , @EndDate date

SET @StartDate = '20190131'
SET @EndDate = '20191130'

SELECT      latest_account_process.[Account Count]
            ,latest_account_process.[Month Name]
            ,latest_account_process.[Process Date]
FROM        (
            SELECT  COUNT(*)                                                                                        AS [Account Count]
                    ,DATENAME(MONTH,ProcessDate)                                                                    AS [Month Name]
                    ,acct.ProcessDate                                                                               AS [Process Date]
                    ,ROW_NUMBER() OVER(PARTITION BY DATENAME(MONTH,ProcessDate) ORDER BY acct.ProcessDate DESC)     AS rownum
            FROM    @ARCUSYM000_dbo_ACCOUNT acct
            WHERE   acct.CLOSEDATE is null 
            AND     acct.ProcessDate >= @StartDate
            AND     acct.ProcessDate <= @EndDate
            GROUP BY acct.ProcessDate
            ) latest_account_process
WHERE       latest_account_process.rownum = 1
ORDER BY    latest_account_process.[Process Date] DESC
PARTITION BY是您对结果进行分区的月份,ORDER BY用于选择最新的ProcessDate作为第1行,然后您可以在主select语句中筛选子查询的结果


由于我不知道基础表架构,所以我稍微简化了您的SQL,但希望示例中包含足够的内容来帮助您。

我从中得到的结果几乎相同。如果您希望使用最新的[Process Date]唯一的[Account Count],您应该得到完全正确的结果如果有问题,请告诉我CTE的结果。我不知道为什么它给了我这么多的11月份。有可能,在子查询中,你添加年份的方式是添加[Month Name],在我的查询中,你有一个[Month Name]=b[Month Name],你添加了[year]=b[year],你尝试过使用行号吗?这感觉像是一个数据问题。您的原始数据是什么样子的?在除11月以外的任何月份中是否存在acct.ProcessDate的多个值?