我相信已经提出了类似的问题,但我找不到适用于我的解决方案。
我有一个数据库,用于对数字化书籍及其页面进行排序,我正在尝试对包含地图的数千页进行排序。在我使用的第一个列表的两个表中列出了书中的所有页面以及它们在书中出现的顺序,它有三列(bookID,pageOrder,pageID),每个页面都有自己的行。第二个表列出了每个页面上出现的所有位置(在地图中),如果一个页面上有多个位置,则会有两列(pageID,placeID),然后为每个位置添加一个新行。
我需要做的是创建一个select语句,为每个pageID / placeID组合提供一个唯一的数字,但这些数字必须按照它们在书中出现的顺序排列。在SQL Server中,我会这样做:
SELECT ROW_NUMBER() OVER(ORDER BY bp.bookID, bp.pageOrder, pp.placeID) AS uniqueNumber, pp.pageID, pp.placeID
FROM booksAndPages AS bp INNER JOIN pagesAndPlaces AS pp ON bp.pageID = pp.pageID
不幸的是,我被困在使用Access。理想情况下,我想使用单个SQL语句(如果可能)执行此操作,类似于上面的语句,但我也会尝试使用VBA。
非常感谢任何帮助。
答案 0 :(得分:3)
这是您想要的查询:
SELECT ROW_NUMBER() OVER (ORDER BY bp.bookID, bp.pageOrder, pp.placeID) AS uniqueNumber,
pp.pageID, pp.placeID
FROM booksAndPages AS bp INNER JOIN
pagesAndPlaces AS pp
ON bp.pageID = pp.pageID;
您可以使用相关子查询获得相同的结果。更复杂,更昂贵,但可能:
SELECT (select count(*)
from booksAndPages AS bp2 INNER JOIN
pagesAndPlaces AS pp2
ON bp2.pageID = pp2.pageID
where bp2.bookID < bp.bookID or
(bp2.bookID = bp.bookID and bp2.pageOrder < bp.pageOrder) or
(bp2.bookID = bp.bookID and bp2.pageOrder = bp.pageOrder and
bp2.placeId <= pp.PlaceId
)
) as uniqueNumber,
pp.pageID, pp.placeID
FROM booksAndPages AS bp INNER JOIN
pagesAndPlaces AS pp
ON bp.pageID = pp.pageID;
这假定组合bookId
,pageOrder
,placeId`是唯一的。
答案 1 :(得分:1)
我知道这是一个老问题,但这是一个热门搜索,我还没有在互联网上看到任何其他解决方案,所以我希望这会有助于其他人。
我的解决方案适用于任何数据集,无论它是否具有唯一标识符。
将以下VBA代码添加到模块中:
Public row as Variant
Function RowNum(dummy) As Integer
row = row + 1
RowNum = row
End Function
Function GetRowNum(dummy) As Integer
GetRowNum = row
End Function
Function ResetRowNum()
row = 0
End Function
现在这是一个示例查询:
SELECT Table1.Field1, Table1.Field2, RowNum([Field1]) AS RowId,
"Row: "&GetRowNum([Field1]) AS RowText
FROM Table1
您可以添加任何&#39; ORDER BY&#39;甚至是&#39; GROUP BY&#39;如果你希望。您可以使用查询输出中的任何字段作为RowNum
和GetRowNum
的输入。需要注意的重要事项是,只有在您第一次使用行号时才使用RowNum
,并且每次都使用GetRowNum
。这是为了防止一行不止一次增加计数器。
您需要做的最后一件事是创建一个运行ResetRowNum
的宏,并在您使用此方法的每个查询之后运行它,或者如果您通过宏或VBA运行一系列查询,确保在每次使用这些函数的查询后运行ResetRowNum
。
同时避免使用数据表视图,因为滚动时似乎不断重新计算公式,使数字稳定增加。
答案 2 :(得分:-2)
查询以排序和/或分组
SELECT Table1.Field1,
Table1.SomeDate,
Table1.Field2,
RowNumber([Field1]) AS RowId,
"Row: " & GetRowNum([Field1]) AS RowText
FROM Table1
ORDER BY Table1.Field1, Table1.SomeDate;
Field1 Field2 RowId RowText
James 2 1 Row: 1
James 35 2 Row: 2
James 6 3 Row: 3
James 86 4 Row: 4
James 67 5 Row: 5
James 35 6 Row: 6
Maria 4 1 Row: 1
Maria 54 2 Row: 2
Samuel 46 1 Row: 1
Samuel 32 2 Row: 2
Samuel 7 3 Row: 3
Thomas 43 1 Row: 1
Thomas 65 2 Row: 2
Thomas 5 3 Row: 3
Public StoredRowNumber As Variant
Public OldlastField As Variant
Function RowNumber(TheField) As Integer
If OldlastField = TheField Then
'nada
Else
ResetRowNum
End If
StoredRowNumber = StoredRowNumber + 1
RowNumber = StoredRowNumber
OldlastField = TheField
End Function
Function GetRowNum(TheField) As Integer
GetRowNum = StoredRowNumber
End Function
Function ResetRowNum()
StoredRowNumber = 0
'OldFieldItem = Null
End Function