如何在SQL Server中查找RowID
如果我使用Row_Number,那么我需要使用orderby或partitionby。这并不能解决我的问题: 表1输入表 预期输出运行总数 在这种情况下,如果我写一个查询如何在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
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;