【发布时间】: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将始终返回一个从1到7的整数,其中1对应于星期日,无论DateFirst或Language的设置如何。 -
如果一个月的最后一个星期五是节假日怎么办?
-
如果一个月的最后一个星期五是假期,它应该仍然显示。只应排除周末。
-
我能看到的一件事是在您的脚本中放置了“或紫罗兰色”。试试这个 (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