按长度排序在 WITH 子句中不起作用。
;WITH Invalids AS
(
SELECT TOP 1 WITH TIES
GroupNumber,
RTRIM(Address1) Address1,
RTRIM(Postcode) Postcode
FROM dbo.LoadData WHERE GroupNumber NOT IN
(
'000','016','018','025','044','048','049','053','054','055','060','064','067','069','071','073'
)
ORDER BY ROW_NUMBER() OVER (PARTITION BY GroupNumber ORDER BY LEN(Address1) DESC, LEN(Postcode) DESC )
)
UPDATE dbo.LoadData
SET
Valid = 0,
Reason = Reason + 'Bad address; '
WHERE GroupNumber =
(
SELECT GroupNumber FROM Invalids WHERE LEN(Address1) = 0 OR LEN(Postcode) = 0
Run Code Online (Sandbox Code Playgroud) 我正在使用ROW_NUMBER()SQL Server中的函数来创建一个名为的新列RowNumber.
但是当我稍后在同一个查询中引用WHERE语句中的这个新字段时,我得到了这个错误,即使该字段应该是一个整数:
将varchar值'RowNumber'转换为数据类型int时转换失败
这是我的查询:
SELECT
ROW_NUMBER() OVER(PARTITION BY c.Node_base ORDER BY sum(c.Score) DESC) AS "RowNumber",
c.Node_base, c.Node_forslag, sum(Score)
FROM
t_input as c
WHERE 'RowNumber' < 11
GROUP BY c.Node_base, c.Node_forslag
ORDER BY c.Node_base desc
Run Code Online (Sandbox Code Playgroud) 我在 rdcl 报告中使用 rownumber(nothing) 创建了一个带有序列号的报告。因为,我在报告中使用了一个组,所以序列号与前一组继续,我得到的报告如下
组 1 1 值
2 值
3 值
组2 4值
5值
6值
但我需要它就像
组 1 1 值
2 值
3 值
组 2 1 值
2 值
3 值
我什至尝试使用 RunningValue 函数。可以按照我需要的方式实现吗?
我需要找到具有相同姓名和出生日期的用户。我还必须包含每个人的客户端 ID,因此我无法COUNT(*)与 group by 一起使用。我ROW_NUMBER()在 CTE 中使用按这三列进行分区。但我需要包含所有多个值,包括where rownumber = 1.
这就是我现在所拥有的:
;WITH
Rownumbers AS
(
SELECT
[Client code]
,Name
,Surname
,[Date of Birth]
,ROW_NUMBER() OVER
(PARTITION BY
name
,surname
,[DATE of birth]
ORDER BY
[client code]
)AS [Row Number]
FROM
kyc_details
)
SELECT
,[client code]
,Name
,Surname
,[DATE of birth]
,[Row Number]
FROM
[Rownumbers]
WHERE
[Row Number] > 1
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我需要包括rownumber = 1. 本质上,我需要选择所有具有重复值的列,但客户端代码将是唯一的。
我有一个包含 5 列的 HTML 表格。第一列是“行号”,我想在其中显示它是哪一行——从 1 开始。
我试过使用这个 CSS:
body {
/* Set the Serial counter to 0 */
counter-reset: Serial;
}
table {
border-collapse: separate;
}
tr td:first-child:before {
/* Increment the Serial counter */
counter-increment: Serial;
/* Display the counter */
content: "Serial is: " counter(Serial);
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有日期时间字段(“时间”)和一个整数字段(“索引”)的表
请看下面的查询和图片。我希望 ROW_NUMBER 在索引更改时从 1 开始计数,如果索引值存在于前几行中也是如此。红色文本表示我想从查询中获得的输出。如何修改查询以获得预期的结果?

查询:
select rv.[time], rv.[index], ROW_NUMBER() OVER(PARTITION BY rv.[index] ORDER BY rv.[time], rv.[index] ASC) AS Row#
from
tbl
Run Code Online (Sandbox Code Playgroud) 我在Sql Server(2008)中提交以下查询
WITH query AS (SELECT TOP 100 PERCENT
ROW_NUMBER() OVER
(ORDER BY [tbl2].[col2] ASC) AS TableRowNumber ,
[tbl1].[col1] ,
[tbl2].[col2]
FROM [db1].[dbo].[tbl1] AS [tbl1]
JOIN [db2].[dbo].[tbl2] AS [tbl2]
ON [tbl1].[id] = [tbl2].[id])
SELECT
*
FROM query
WHERE TableRowNumber BETWEEN 1 AND 15
ORDER BY TableRowNumber ASC
Run Code Online (Sandbox Code Playgroud)
运行此查询时,它将返回以下错误消息:
Msg 207, Level 16, State 1, Line 3
Invalid column name 'col2'.
Run Code Online (Sandbox Code Playgroud)
sql连接本身运行正常(当作为普通查询运行时.问题似乎是使用Row_Number() over (Order By COLUMN)when COLUMN在FROM与查询表不同的数据库中.
如果我将第3行更改为读取,(Order By [tbl1].[col1] ASC)那么它运行没有任何问题.仅当排序列位于不同的DB中时才会发生此错误.
有谁知道为什么会这样?对于如何解决这个问题,有任何的建议吗?
让我说我有这样的表变量声明...
DECLARE @LocalTable TABLE
(
IdField NVARCHAR(MAX),
NameField NVARCHAR(MAX)
)
Run Code Online (Sandbox Code Playgroud)
我这样填充它......
INSERT INTO @LocalTable
SELECT
IdColumn,
NameColumn
FROM SourceTable
Run Code Online (Sandbox Code Playgroud)
NameColumn在源表中可能有重复的值,因此NameField在本地表中将具有相同的重复值.
让我们说我想将本地表插入到目标表中,就像这样......
INSERT INTO TargetTable (NewIdColumn, NewNameColumn)
SELECT
IdField,
NameField
FROM
@LocalTable
Run Code Online (Sandbox Code Playgroud)
但是:NewNameColumnin TargetTable有一个UNIQUE约束,因此重复会导致异常.
我想应用这个例子,
ROW_NUMBER() OVER(PARTITION BY NameField ORDER BY NameField)
Run Code Online (Sandbox Code Playgroud)
这样NameField附加/后缀有表示其重复的数字.
我有这个工作示例可以选择正确的附加值,但我无法在这样的更新语句中使用它:
UPDATE localtable
SET NameField = AppendedNameField
FROM @LocalTable AS localtable
SELECT
CONCAT(Ref.NameField, ROW_NUMBER() OVER (PARTITION BY Ref.NameField
ORDER BY Source.IdField)), *
FROM
@LocalTable AS Source
INNER JOIN …Run Code Online (Sandbox Code Playgroud) 目标是使用尽可能少的资源返回分区的第一行.到目前为止,我已经看到了使用建议:
with customerinfo_CTE as
(
select row_number() over(partition by customer order by year desc) as RNumber, *
from customerInfo
)
select *
from customerinfo_CTE
where RNumber = 1
Run Code Online (Sandbox Code Playgroud)
所以,我有一个customerInfo表,我们跟踪过去的客户详细信息(IE:联系信息,公司名称等).我此时正在使用CTE,但也可以使用#Temp Table或@Variable Table.
我希望有一种方法可以通过在连接或脚本的其他部分中使用它之前获得CTE(或其他)中唯一的年度第一条记录来提高性能.
现在,我正在使用:
with customerinfo_CTE as
(
select row_number() over(partition by customer order by year desc) as RNumber, *
from customerInfo
)
select *
from customerOrders a
inner join customerinfo_CTE b
on a.CustomerID = b.CustomerID
where b.RNumber = 1
Run Code Online (Sandbox Code Playgroud)
虽然这给了我想要的结果,但我希望有一种方法可以减少它以获得CTE声明中的第一个结果,而不必在连接的where子句中过滤后端.
提前致谢.
我有一个海量数据文件(制表符分隔).我正在经历数据转换 - 在某些时候,日期字段将填充非日期值(来自描述字段的单词左侧).你可以想象,我不能只是滚动文本文件,或者把它放到excel中去挖掘 - 我需要知道在哪里看.
我正在尝试向导入的表添加行号,以便我可以识别发生数据移位的行.所以,我想知道是否有办法插入行号而不必按任何顺序排序(即基本上编号原始数据文件的行).
运用
ROW_Number()OVER(ORDER BY(___))
我不确定如何完成我正在尝试做的事情,因为我无法订购任何东西 - 它需要完全按照导入进行编号.
row-number ×10
sql-server ×7
sql ×6
t-sql ×5
duplicates ×1
grouping ×1
html ×1
javascript ×1
rdlc ×1
reportviewer ×1
row ×1