2

我正在使用 OpenOffice Base (HyperSQL) 进行一些数据转换,并希望customerID根据前三个字符和三个数字生成一个字段,以帮助解决冲突。

获取前三个字符没有问题:

客户 ID Customer_Name
AAA AAA 服务
BUS 商务 R US
NOR 北方曝光
NOR北脸
NOR北岸供应
ZEB斑马画

我想得到这个:

客户 ID Customer_Name
AAA001 AAA 服务
BUS001 商务俄罗斯
NOR001 北曝
NOR002 北脸
NOR003 北岸供应
ZEB001 斑马画

我可以看到,如果 HyperSQL 支持,这将很容易实现row_number(),但似乎并不支持。

还有其他优雅的解决方案吗?

4

3 回答 3

1

HyperSQL 2.2.8 支持ROWNUM()。您可以将此版本用作外部数据库。请参阅此链接http://hsqldb.org/web/openoffice.html

使用 OpenOffice 中包含的 HSQLDB 1.8.0,您可以分多个步骤执行此操作(在使用前三个字符创建列之后)。

UPDATE CUSTOMER SET "CustomerID" = "CustomerID" || '001' 
  WHERE "Customer_Name" IN (
    SELECT MIN("Customer_Name") 
      FROM CUSTOMERS WHERE CHAR_LENGTH("CustomerID") = 3
      GROUP BY "CustomerID"
    )

然后重复“002”、“003”等。

于 2012-06-20T17:00:16.263 回答
0

基本上,您要求的是每个组都有一个排名(在您的情况下,摸索是 per CustomerID)。正如@fredt 所说,没有 HSQLDB 支持PARTITION BY(就像在 MSSQL 下的...),但您可以执行以下操作(如果在字符串顶部添加自动生成的数字ID 并不大)

Select ID, CustomerID, Customer_Name,
     (Select 1 + Count(*) From Customers
      Where CustomerID = A.CustomerID
         And Id < A.Id) Rank
 From Customers A 

Rank 列将为您提供每个组的行号

于 2013-10-11T13:09:46.277 回答
0

您也可以在 HSQLDB 中实现 ROWNUM() OVER(PARTITION BY ... ORDER BY ...),但有一些限制。此处的解决方案假定 Customer_Name 上没有重复项,并且 Customer_Name 上不允许有 NULL 值。

SELECT A.Partition || RIGHT('00' || count(B.Part), 3) AS "CustomerID", Customer_Name
FROM ( SELECT LEFT(Customer_Name,3) AS "Partition", Customer_Name FROM Table ) A
LEFT JOIN ( SELECT LEFT(Customer_Name,3) AS "Partition", Customer_Name FROM Table ) B
    ON A.Customer_Name >= B.Customer_Name AND A.Partition = B.Partition
GROUP BY A.Partition, A.Customer_Name

只是为了使解决方案更通用一点;当您的唯一订单位于两个字段 F1、F2 上时,请使用以下表达式:

ON ( A.F1 = B.F1 AND A.F2 >= B.F2 OR A.F1 > B.F1 ) AND A.Partition = B.Partition
于 2018-07-03T06:51:21.170 回答