Sql server 在表中显示每月最新的31条记录和最后一个工作日(不包括周六、周日,但可以包括节假日)

Sql server 在表中显示每月最新的31条记录和最后一个工作日(不包括周六、周日,但可以包括节假日),sql-server,tsql,Sql Server,Tsql,我有一个表格,其中我想显示每个值的31条最新记录——蓝色、红色、绿色,以及这3个值和所有紫色记录的每月最后一个工作日 Color Count date blue 3 2019-03-24 red 4 2019-03-24 green 2 2019-03-24 violet 1 2019-03-23 blue 3 2019-03-23 ... ... ... Blue 31 2016-01-31 工作日是指一个月的最后一天,如果是周六

我有一个表格,其中我想显示每个值的31条最新记录——蓝色、红色、绿色,以及这3个值和所有紫色记录的每月最后一个工作日

Color   Count   date
blue    3   2019-03-24
red     4   2019-03-24
green   2   2019-03-24
violet  1   2019-03-23
blue    3   2019-03-23
... ... ...
Blue    31  2016-01-31
工作日是指一个月的最后一天,如果是周六或周日,则应显示周五。如果是工作日,那么这一天将是本月的最后一个工作日

我创建了下面的查询,但它没有显示每个月的最后一个工作日。我做错了什么?正确的查询方式是什么

SELECT  color,count,date
FROM(
     SELECT *, ROW_NUMBER() OVER(PARTITION BY color ORDER BY date DESC) RN
     FROM table
    ) V
WHERE V.RN < 32
     AND color  IN ('blue','Red','Green') or color = 'violet'
     and CAST(DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)) - CASE DATENAME(dw, DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)))
        WHEN 'SUNDAY' THEN 2
        WHEN 'SATURDAY' THEN 1
        ELSE 0
        END AS DATE) != CAST(date AS DATE) 
    and color  IN ('blue','Red','Green') or color = 'violet'    
    order by color desc
预期产量:前31条蓝色记录、前31条红色记录、前31条绿色记录及其最后一个工作日,不包括每个月的周末和所有紫色记录


我得到的是每3个值的31条记录和所有紫色记录,但不是每个月的最后一个工作日

我发现我做错了什么。在两个地方只做了一些小的更改,现在查询工作正常

正确的查询是:

SELECT  color,count,date
FROM(
     SELECT *, ROW_NUMBER() OVER(PARTITION BY color ORDER BY date DESC) RN
     FROM table
    ) V
WHERE RN < 32
     AND color  IN ('blue','Red','Green') OR color = 'violet'
     OR CAST(DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)) 
     - CASE DATENAME(dw, DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)))
        WHEN 'SUNDAY' THEN 2
        WHEN 'SATURDAY' THEN 1
        ELSE 0
        END AS DATE) = CAST(date AS DATE)
    and color  IN ('blue','Red','Green') OR color = 'violet'    
    ORDER BY color desc

我知道我做错了什么。在两个地方只做了一些小的更改,现在查询工作正常

正确的查询是:

SELECT  color,count,date
FROM(
     SELECT *, ROW_NUMBER() OVER(PARTITION BY color ORDER BY date DESC) RN
     FROM table
    ) V
WHERE RN < 32
     AND color  IN ('blue','Red','Green') OR color = 'violet'
     OR CAST(DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)) 
     - CASE DATENAME(dw, DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)))
        WHEN 'SUNDAY' THEN 2
        WHEN 'SATURDAY' THEN 1
        ELSE 0
        END AS DATE) = CAST(date AS DATE)
    and color  IN ('blue','Red','Green') OR color = 'violet'    
    ORDER BY color desc

提示:@@DateFirst+DatePart weekday,SampleDate-1%7+1将始终返回一个从1到7的整数,其中1对应于星期日,而不考虑DateFirst或Language的设置。如果该月的最后一个星期五是假日怎么办?如果该月的最后一个星期五是假日,则仍应显示它。只有周末应该被排除在外。我能看到的一件事是“或紫罗兰”在你的剧本中的位置。使用“蓝色”、“红色”、“绿色”和CASTDATEADDd尝试此颜色,-1、DATEADDmm、DATEDIFFmm、0、日期+1、0-案例DATENAMEdw、DATEADDd,-1、DATEADDmm、DATEDIFFmm、0、日期+1、0当“星期日”时为0,当“星期六”时为2,然后1其他0作为日期结束!=CASTdate AS DATE或color='violet'旁白:如果您使用的是SQL Server的合理最新版本,您可能需要查看该函数。提示:@@DateFirst+DatePart weekday,SampleDate-1%7+1将始终返回一个从1到7的整数,其中1对应于星期日,而不考虑DateFirst或Language的设置。如果一个月的最后一个星期五是假日该怎么办?如果该月的最后一个星期五是假日,则仍应显示它。只有周末应该被排除在外。我能看到的一件事是“或紫罗兰”在你的剧本中的位置。使用“蓝色”、“红色”、“绿色”和CASTDATEADDd尝试此颜色,-1、DATEADDmm、DATEDIFFmm、0、日期+1、0-案例DATENAMEdw、DATEADDd,-1、DATEADDmm、DATEDIFFmm、0、日期+1、0当“星期日”时为0,当“星期六”时为2,然后1其他0作为日期结束!=CASTdate AS DATE或color='violet'放在一边:如果您使用的是SQL Server的合理最新版本,您可能需要查看该函数。