首先:这不是一种 IDENTITY(( 字段。
在 QlikView 中,它用于根据发送到函数的参数生成一个数字。在此处查看其文档:https://help.qlik.com/en-US/qlikview/November2017/Subsystems/Client/Content/Scripting/CounterFunctions/autonumber.htm
简而言之,您向其发送一个参数,它返回一个整数,该整数将为脚本的其余部分标识相同的参数。如果您发送...
AutoNumber('Name 900') -> returns 1
AutoNumber('Name 300') -> returns 2
AutoNumber('Name 001') -> returns 3
AutoNumber('Name 900') -> returns 1 ... again
并且因为该参数已经在自动编号的实习生列表中
我试图在SQL Server中构建一些类似的内容,但不可能在标量函数中使用SELECT。
我需要的是得到类似的东西...
INSERT INTO FacSales (SumaryID, InvoiceID, InvoiceDate
, ProductID, SaleValue, CustomerID, VendorID)
SELECT AutoNumber(sale.VendorID, sale.CustomerID, sale.ProductID)
, sale.InvoiceID
, sale.SaleDate
, details.ProductID
, etc, etc, etc.
在SQL Server内部,是否有执行此操作的"本机"函数?或者,有没有办法使用过程/函数构建它?
谢谢。
DENSE_RANK(Transact-SQL(
返回结果集分区中行的排名,不 排名中的任何差距。一行的秩是 1 加上 在相关行之前的不同等级。
declare @T table
(
ID int identity,
VendorID int,
CustomerID int,
ProductID int
);
insert into @T values
(1, 2, 3),
(1, 2, 3),
(1, 2, 4),
(1, 2, 3);
select sale.ID,
sale.VendorID,
sale.CustomerID,
sale.ProductID,
dense_rank() over(order by sale.VendorID,
sale.CustomerID,
sale.ProductID) as AutoNumber
from @T as sale
order by sale.ID;
结果:
ID VendorID CustomerID ProductID AutoNumber
----------- ----------- ----------- ----------- --------------------
1 1 2 3 1
2 1 2 3 1
3 1 2 4 2
4 1 2 3 1
你基本上想要一个键值存储。 有很多方法可以制作一个。
这是一个可能的解决方案。 它使用存储过程。
但是,您没有说明这些值是无限期保留还是仅用于单个调用。 此示例演示如何无限期地执行此操作。
可以通过谨慎使用临时表将其修改为单个调用或连接。 如果不是呼叫或连接,则需要按照该计划清理autoNumber.AutoNumber
表和autoNumber.NextAutoNumber
。
-- Create the table, sequence and sproc
-- Create a schema to hold our autonumber table and sequence
CREATE SCHEMA autoNumber
GO
-- Create a sequence. This just gives us a new number when ever we want.
-- This could be replaced with an identity column.
CREATE SEQUENCE autoNumber.NextAutoNumber AS [bigint]
START WITH 1
INCREMENT BY 1
NO CACHE
GO
-- Create a table to hold the auto number key value pairs.
CREATE TABLE autoNumber.AutoNumber(KeyValue varchar(255), Number bigint)
go
-- This is the stored procedure that actually does the work of getting the autonumber
CREATE PROCEDURE autoNumber.GetAutoNumber @KeyValue varchar(255), @AutoNumber bigint = -1 output AS
BEGIN
DECLARE @Number bigint = null
-- See if we already have an autonumber created for this keyvalue
-- If we do, then set @Number to that value
SELECT @Number = autoNum.Number
FROM autoNumber.AutoNumber autoNum
WHERE autoNum.KeyValue = @KeyValue
IF (@Number is null)
BEGIN
-- If @Number was not changed, then we did not find one
-- in the table for this @KeyValue. Make a new one
-- and insert it.
SET @Number = NEXT VALUE FOR autonumber.NextAutoNumber
INSERT INTO autoNumber.AutoNumber ( KeyValue, Number)
VALUES (@KeyValue, @Number)
END
-- Return our number to the caller.
-- This uses either an output parameter or a select.
IF (@AutoNumber = -1)
BEGIN
select @Number
END ELSE
BEGIN
set @AutoNumber = @Number
END
END
GO
-- End Create
-- Testing with "select"
EXEC autoNumber.GetAutoNumber 'Name 900'
EXEC autoNumber.GetAutoNumber 'Name 300'
EXEC autoNumber.GetAutoNumber 'Name 001'
EXEC autoNumber.GetAutoNumber 'Name 900'
-- Testing with output parameter
DECLARE @AutoNumber bigint
EXEC autoNumber.GetAutoNumber 'Name 900', @AutoNumber OUTPUT
SELECT @AutoNumber
EXEC autoNumber.GetAutoNumber 'Name 300', @AutoNumber OUTPUT
SELECT @AutoNumber
EXEC autoNumber.GetAutoNumber 'Name 001', @AutoNumber OUTPUT
SELECT @AutoNumber
EXEC autoNumber.GetAutoNumber 'Name 900', @AutoNumber OUTPUT
SELECT @AutoNumber
-- End Testing
-- Clean up
DROP PROCEDURE autoNumber.GetAutoNumber
GO
DROP TABLE autoNumber.AutoNumber
GO
drop SEQUENCE autoNumber.NextAutoNumber
DROP SCHEMA autoNumber
GO
-- End Cleanup
SQL Server最接近的是CHECKSUM
函数。
您可以使用它来计算任意数量的列的哈希值,例如
SELECT CHECKSUM( 'abc', 123, 'zxc' )
UNION ALL
SELECT CHECKSUM( 'abc', 124, 'zxc' )
UNION ALL
SELECT CHECKSUM( 'abc', 123, 'zxc' )
输出:
-----------
53066784
53066832
53066784
我想你正在寻找ROW_NUMBER((。
使用此sql函数,您可以按所需的所有字段进行分区和排序。
SELECT ROW_NUMBER() OVER(PARTITION BY sale.VendorID, sale.CustomerID, sale.ProductID ORDER BY sale.VendorID, sale.CustomerID, sale.ProductID)
, sale.InvoiceID
, sale.SaleDate
, details.ProductID FROM table