AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 286308
Accepted
Gus
Gus
Asked: 2021-03-03 10:19:45 +0800 CST2021-03-03 10:19:45 +0800 CST 2021-03-03 10:19:45 +0800 CST

如何根据行数和可调的批量大小将 GUID 分配给批量数据

  • 772

我需要为成批的行分配一个通用的 GUID id(供外部进程使用)。

下面是一个简化的设置,描述了我正在寻找的内容:

BASE_TABLE表示此方案中的一个预先存在的表,显然已大大简化。“真实”表中的值应该被认为是随机的;它们在现实生活中不是连续的(即使 ID 也不是真正的 int)

CREATE TABLE BASE_TABLE (
    ID int
    ,VALUE1 varchar(10)
    ,VALUE2 varchar(255)
) 

TARGET_TABLEuniqueIdentifier代表我正在处理的过程的“输出”,它只是需要批量数据为​​每个批次都有一个 BATCHID 的其他东西的输入。现实生活中的批次约为 1000 行。

CREATE TABLE TARGET_TABLE 
(
  ID int
  ,VALUE1 varchar(10)
  ,VALUE2 varchar(255)
  ,BATCHID uniqueIdentifier
)

(添加一些虚拟数据)

DECLARE @DATA1 int
set @DATA1=0
WHILE @DATA1<100
BEGIN
  INSERT INTO BASE_TABLE (ID,VALUE1,VALUE2) VALUES (@DATA1,'v1'+CONVERT(varchar,@DATA1), 'v2'+CONVERT(varchar,@DATA1))
  SET @DATA1=@DATA1+1
END

/** 示例 DESIRED RESULT,批量大小为 5

ID 价值1 价值2 批处理ID
0 v10 v20 38B1B4FB-7F1E-44FD-9336-19095C01C629
1 v11 v21 38B1B4FB-7F1E-44FD-9336-19095C01C629
2 v12 v22 38B1B4FB-7F1E-44FD-9336-19095C01C629
3 v13 v23 38B1B4FB-7F1E-44FD-9336-19095C01C629
4 v14 v24 38B1B4FB-7F1E-44FD-9336-19095C01C629
5 v15 v25 41122454-A743-4545-8F0C-D7B461E072AE
6 v16 v26 41122454-A743-4545-8F0C-D7B461E072AE
7 v17 v27 41122454-A743-4545-8F0C-D7B461E072AE
8 v18 v28 41122454-A743-4545-8F0C-D7B461E072AE
9 v19 v29 41122454-A743-4545-8F0C-D7B461E072AE
10 v110 v210 41122454-A743-4545-8F0C-D7B461E072AE
11 v111 v211 FBDE5513-C869-4F2D-AC4D-40CBEF4A2D48

ETC

重要的结果是,对于每个大小为 N 的批次,有 N 行具有相同的 BatchID,它必须是一个 GUID。

我很确定我可以用光标做我想做的事,但如果可能的话,我想做这样的事情:

select 
ID,VALUE1,VALUE2,
NEWID() OVER(PARTITION BY ROW_NUMBER() OVER (ORDER BY ID)) AS BatchID
from BASE_TABLE

但它无效,因为 NEWID() 不是聚合函数。

sql-server uuid
  • 1 1 个回答
  • 135 Views

1 个回答

  • Voted
  1. Best Answer
    MBuschi
    2021-03-03T14:51:12+08:002021-03-03T14:51:12+08:00

    你必须玩 row_numbers

     declare @part int = 3
     
     ;with baseRowNums as 
      (
        SELECT ID, VALUE1, VALUE2,
           Row_Number() Over (ORDER BY ID) AS rn
        FROM BASE_TABLE
      )
     ,batchNums as
     (
     SELECT *,
        Sum(CASE WHEN rn % @part = 1 THEN 1 ELSE 0 END)
        Over (ORDER BY ID, rn 
              ROWS Unbounded Preceding) AS part
     FROM baseRowNums
     )
     ,GUIDs as
     (select part, MAX(newid()) as GUID
      from batchNums
      group by part
     )
     select ID, VALUE1, VALUE2, GUIDs.GUID
     from batchNums
     join GUIDs on batchNums.part = GUIDs.part
    

    https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=7c26d9bab095ce9d8ca1abf1f4c1a898

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve