在多个组中排名和有效查询多个表更新

时间:2018-11-18 18:36:07

标签: sql-server

我正在尝试按月添加按销售额排列的排名,还将日期列更改为仅显示每月最后一天的“月末”字段。

我可以连续做两套而不添加更新吗?
我每个月都在寻找前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 |
+------+-----------+-------+------+

1 个答案:

答案 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子句生效。