【问题标题】:Display latest 31 records and last working business day(excluding Saturday, Sunday but can include holidays) of every month in table在表格中显示每个月的最新31条记录和最后一个工作日(不包括周六、周日,但可以包括节假日)
【发布时间】:2019-08-08 01:20:23
【问题描述】:

我有一个表格,我想在其中显示每个值的每 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 条记录,但不是每个月的最后一个工作日

【问题讨论】:

  • 提示:( @@DateFirst + DatePart( weekday, SampleDate ) - 1 ) % 7 + 1 将始终返回一个从17 的整数,其中1 对应于星期日,无论DateFirstLanguage 的设置如何。
  • 如果一个月的最后一个星期五是节假日怎么办?
  • 如果一个月的最后一个星期五是假期,它应该仍然显示。只应排除周末。
  • 我能看到的一件事是在您的脚本中放置了“或紫罗兰色”。试试这个 (color IN ('blue','Red','Green') 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(日期作为日期))或颜色='紫罗兰色'
  • 旁白:如果您使用的是相当当前版本的 SQL Server,您可能需要查看 EOMonth 函数。

标签: sql-server tsql


【解决方案1】:

我发现我做错了什么。两个地方只有很小的变化,现在查询工作正常。

正确的查询是:

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

【讨论】:

    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多