【问题标题】:Totalling values until I get to a certain point总计值直到我到达某个点
【发布时间】:2020-12-24 02:41:18
【问题描述】:

我正在尝试执行以下操作:

  1. DIVLOC 和具有最高值的DISTRIB 对记录进行排序
  2. 然后将每个DIVLOCDISTRIB 相加,直到达到 >=.60
  3. 为每个DIVLOC 组成60 条记录的这些记录转为ETAFLAG = 1

所以对于我下面底部的结果示例

-- --Create Fake table 
DECLARE @ETATRACTS TABLE (DIVLOC int, TRACTID int, Distrib float, ETAFLAG bit)

INSERT INTO @ETATRACTS VALUES (71001, 1123, .30, 0)
INSERT INTO @ETATRACTS VALUES (71001, 1010, .20, 0)
INSERT INTO @ETATRACTS VALUES (71001, 3010, .10, 0)
INSERT INTO @ETATRACTS VALUES (71001, 0790, .05, 0)
INSERT INTO @ETATRACTS VALUES (71001, 6010, .05, 0)
INSERT INTO @ETATRACTS VALUES (71250, 3010, .40, 0)
INSERT INTO @ETATRACTS VALUES (71250, 0610, .10, 0)
INSERT INTO @ETATRACTS VALUES (71250, 3210, .10, 0)
INSERT INTO @ETATRACTS VALUES (71250, 1920, .05, 0)
INSERT INTO @ETATRACTS VALUES (71250, 9720, .05, 0)
INSERT INTO @ETATRACTS VALUES (71250, 2110, .05, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .20, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .20, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .05, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .05, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .01, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .01, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .01, 0)
INSERT INTO @ETATRACTS VALUES (71425, 5011, .01, 0)

UPDATE @ETATRACTS
SET ETAFLAG = t.ETAFLAG
FROM @ETATRACTS AS temptable, 
     (SELECT 
          DIVLOC, TRACTID, Distrib,
          (CASE WHEN SUM(Distrib) OVER (PARTITION BY divloc) - Distrib >= 0.2
                 THEN 1
           END) AS ETAFLAG
       FROM @ETATRACTS) AS t
WHERE 
    temptable.divloc = t.DIVLOC AND temptable.TRACTID = t.TRACTID

SELECT * FROM @ETATRACTS

enter image description here

【问题讨论】:

    标签: sql sql-server tsql ssms


    【解决方案1】:

    您可以为此编写select 查询:

    select e.*,
           (case when sum(Distrib) over (partition by divloc order by Distrib desc) - Distrib < 0.6
                 then 1 else 0
            end) as ETAFLAG
    from @ETATRACTS e;
    

    这个逻辑可以很容易地放入update

    with toupdate (
          select e.*,
                 (case when sum(Distrib) over (partition by divloc order by Distrib desc) - Distrib < 0.6
                       then 1 else 0
                  end) as new_ETAFLAG
          from @ETATRACTS e
         )
    update toupdate
        set new_ETAFLAG = ETAFLAG;
    

    【讨论】:

    • 这太愚蠢了,但是当我运行你提议的这段代码时,我得到了这个错误:Msg 102, Level 15, State 1, Line 28 Incorrect syntax near 'order'。
    • @Bearcatrunner 。 . .所有受支持的 SQL Server 版本都支持累积和。您可能正在使用不受支持的版本或将兼容性设置为较早的版本。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多