Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中查找RowID_Sql_Sql Server_Tsql - Fatal编程技术网

如何在SQL Server中查找RowID

如何在SQL Server中查找RowID,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果我使用Row_Number,那么我需要使用orderby或partitionby。这并不能解决我的问题: 表1输入表 预期输出运行总数 在这种情况下,如果我写一个查询 Select name, sum(Sal) over(order by name) from tab_1 它不会返回完美的结果,因为名称按顺序排列。请尝试以下操作: Select name, sum(Sal) Sal, row_number() over(order by sum(Sal)) Row_id from t

如果我使用Row_Number,那么我需要使用orderby或partitionby。这并不能解决我的问题:

表1输入表

预期输出运行总数

在这种情况下,如果我写一个查询

Select name, sum(Sal) over(order by name)
from tab_1
它不会返回完美的结果,因为名称按顺序排列。

请尝试以下操作:

Select name, 
sum(Sal) Sal, 
row_number() over(order by sum(Sal)) Row_id 
from tab_1 group by name

为了遵守插入数据的顺序,需要在表中添加一些额外的内容。 例如,由标识自动填充的标识。 然后可以在排序中使用该额外字段

例如:

返回:

没有可供排序的列? 也许可以使用隐藏的虚拟列%%LockRes%%或%%physloc%%

例如,对于不带PK的测试表:

CREATE TABLE tab_1 (
 Name VARCHAR(30) NOT NULL, 
 Sal DECIMAL(10,2) NOT NULL DEFAULT 0
);
INSERT INTO tab_1 (Name, Sal) VALUES
('A',100),
('C',200),
('D',150),
('B',50);
使用%%LockRes%%的查询:

或使用%%physloc%%的:


两者都返回相同的结果。

一个运行总数需要一个行顺序来计算其结果。引擎的默认顺序没有意义,它可能会随着时间的推移而改变,这取决于表的页面分配和索引。SQL Server上不保证通过重复相同的SELECT而不使用order by来保持行顺序一致

很容易想到,在一个只有4行的测试表示例中,反复执行相同的选择并看到相同的结果会让您认为存在隐式顺序,很可能引擎只是返回作为堆存储的行。如果您创建一个聚类索引,它可能会改变。在任何情况下,您都不应该假定任何顺序,因为这将导致糟糕的编程实践


因此,只要您没有特定的列来正确排列行,您当前的问题就没有解决方案。我建议始终添加一个带有默认值的datetime列,例如:CreatedDate datetime default GETDATE,这样至少您知道每一行是何时创建的,并且可以按该行排序,尽管插入过程可能会在此列上显式指示NULL,这会让人神经紧张。

创建表TableName char1,工资整数

插入表格 选择“A”,100 插入表格 选择“C”,200 插入表格 选择“D”,150 插入表格 选择“B”,50

);派生表 挑选* ,RN=选择1000后订单上的行数 从桌子上 选择名称,CumulativeSum=按RN、从cte中选择RN的订单上的工资总额


我想我找到了解决方案。

那么,您想使用哪一列来对累计和进行排序?正确-但您似乎错误地假设表中的行具有定义的顺序,您可以将其用于此类事情。为此目的添加列,或者无法实现目标。我需要输出表。。如何获取@GMBRows在表中没有和顺序,如果您希望保持Tab_1打印输出的顺序,则需要在此表中添加一列来定义顺序,查询未给出正确的结果。谢谢:。。但在oracle中,这可能是正确的,因为oracle有RowId。oracle有RowId,但似乎也不能保证它与行插入顺序一致匹配。嗯,我找到了相关的文章。但不确定人们能在多大程度上依赖这种特殊的、不受支持的技巧。使用ID或DatetimeCreated字段会更可靠。@AryanSena只是为了好玩,我添加了一些替代方法。但是不确定他们有一张大桌子有多可靠。
Name    CumulativeSalary    RowId
A       100,00              1
C       300,00              2
D       450,00              3
B       500,00              4
CREATE TABLE tab_1 (
 Name VARCHAR(30) NOT NULL, 
 Sal DECIMAL(10,2) NOT NULL DEFAULT 0
);
INSERT INTO tab_1 (Name, Sal) VALUES
('A',100),
('C',200),
('D',150),
('B',50);
SELECT
 Name,
 SUM(Sal) OVER (ORDER BY n1, n2, n3) AS CumulativeSalary,
 ROW_NUMBER() OVER (ORDER BY n1, n2, n3) AS RowId
FROM tab_1
OUTER APPLY
(
    SELECT 
    CAST(PARSENAME(REPLACE( %%LockRes%%, ':','.'),3) AS INT) AS n1,
    CAST(PARSENAME(REPLACE( %%LockRes%%, ':','.'),2) AS INT) AS n2,
    CAST(PARSENAME(REPLACE( %%LockRes%%, ':','.'),1) AS INT) AS n3
) o
ORDER BY RowId;
SELECT
 Name,
 SUM(Sal) OVER (ORDER BY %%physloc%%) AS CumulativeSalary,
 ROW_NUMBER() OVER (ORDER BY %%physloc%%) AS RowId
FROM tab_1
ORDER BY RowId;