更改整个组中列的值

时间:2015-09-01 11:29:48

标签: sql-server

给出示例

enter image description here

通过GRP_ID和GRP_MAIN集定义组。橙色和绿色是它应该得到的例子。蓝色是我们拥有的。

所有具有相同NAME的人应该被分组以具有相同的UNIQUE GRP_ID(唯一是重要的,因为已经有一些数据组合在一起)并且MAX或TOP或AVG记录应该被标记为GRP_MAIN。

  • 所以我的第一个问题是,如何为整个组设置一个值 列,所以我可以在NAME分组后做GRP_ID = 1
  • Secound是,如何根据号码检查所有现有的GRP_ID?
  • 第三,如何选择GRP_ID中所有现有的下一个免费号码?

1 个答案:

答案 0 :(得分:0)

只需将其复制到一个空的查询窗口并执行......以适应您的需求......

您应该使用此查询一次将数据随机播放到包含GRU_ID和GRP_MAIN列的新表中。 GRP_ID应该是IDENTITY ......

DECLARE @tbl TABLE(VALUE INT, NAME VARCHAR(10));
INSERT INTO @tbl VALUES
 (12,'ab')
,(1,'ab')
,(2,'ab')
,(34,'ab')
,(5,'ab')
,(6,'ab')
,(3,'fg')
,(45,'fg')
,(65,'fg')
,(2,'ht')
,(3,'ht')
,(44,'hh')
,(5,'hh')
,(6,'hh')
,(7,'hh');

WITH DistinctNames AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY Name) AS Inx, x.NAME
    FROM
    (
        SELECT DISTINCT NAME
        FROM @tbl      
    ) AS x
)
SELECT dn.Inx AS GRP_ID
      ,CASE WHEN tbl.Value=MainRec.VALUE THEN 1 ELSE 0 END AS GRP_MAIN
      ,tbl.VALUE
      ,tbl.NAME
FROM @tbl AS tbl
INNER JOIN DistinctNames AS dn ON tbl.NAME=dn.NAME
CROSS APPLY(SELECT TOP 1 x.* FROM @tbl AS x WHERE x.NAME=dn.NAME ORDER BY VALUE DESC) AS MainRec