我正在尝试按月添加按销售额排列的排名,还将日期列更改为仅显示每月最后一天的“月末”字段。
我可以连续做两套而不添加更新吗?
我每个月都在寻找前2名-按工作限制和分组吗?
我觉得这是正确且最有效的查询,但它不起作用-感谢您提供任何帮助!
UPDATE table1
SET DATE=EOMONTH(DATE) AS MONTH_END;
ALTER TABLE table1
ADD COLUMN RANK INT AFTER sales;
UPDATE table1
SET RANK=
RANK() OVER(PARTITION BY cust ORDER BY sales DESC);
LIMIT 2
原始表
+------+----------+-------+--+
| CUST | DATE | SALES | |
+------+----------+-------+--+
| 36 | 3-5-2018 | 50 | |
| 37 | 3-15-18 | 100 | |
| 38 | 3-25-18 | 65 | |
| 37 | 4-5-18 | 95 | |
| 39 | 4-21-18 | 500 | |
| 40 | 4-45-18 | 199 | |
+------+----------+-------+--+
desired output
+------+-----------+-------+------+
| CUST | Month End | SALES | Rank |
+------+-----------+-------+------+
| | | | |
| 37 | 3-31-18 | 100 | 1 |
| 38 | 3-31-18 | 65 | 2 |
| 39 | 4-30-18 | 500 | 1 |
| 40 | 4-30-18 | 199 | 2 |
+------+-----------+-------+------+
答案 0 :(得分:1)
我不知道您为什么想要EOMONTH作为存储值,但是您拥有的东西将起作用。
我不会使用[rank]作为列名,因为我会避免在SQL中使用任何单词,例如[sales_rank]或类似的词。
ALTER TABLE table1
ADD COLUMN [sales_rank] INT AFTER sales;
with cte as (
select
cust
, DENSE_RANK() OVER(PARTITION BY cust ORDER BY sales DESC) as ranking
from table1
)
update cte
set sales_rank = ranking
where ranking < 3
;
LIMIT 2并不是可以在SQL Server中使用的东西,并且肯定不能“按组”使用。使用rank()
或dense_rank()
之类的“窗口函数”时,可以在下一个“层”的where子句中使用它们的输出。即在子查询(或cte)中使用这些函数,然后使用where子句按计算出的值过滤行。
还要注意,我使用dense_rank()
来确保不跳过任何等级编号,以使后续的where子句生效。