我有一个表格,我要在其中显示这些值中的每一个的最近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条记录及其最后一个工作日(仅不包括周末)以及所有紫色的记录。 < / p>
我得到的是每3个值有31条记录,所有紫罗兰色记录,但不是每个月的最后一个工作日
答案 0 :(得分:0)
我弄清楚我做错了什么。在两个地方只有很小的变化,现在查询可以正常工作了。
正确的查询是:
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