Achieving ROW_NUMBER / PARTITION BY in MS Access
ms-access, ms-access-2010, sql
Solution
In many cases we can achieve a similar result by performing an unequal self-join on the table and aggregating the results. For example, for data in a table named [MyData]
Ino TYPE DOC
--- -------- ---
1 1800xxc1 3a
2 1810xxc2 3b
3 1700xxc3 3c
4 1700xxc4 3a
5 1800xxc5 3a
6 1800xxc6 3a
7 1800xxc7 3b
the query
SELECT
t1.DOC,
t1.TYPE,
COUNT(*) AS [Ino Seq]
FROM
MyData AS t1
INNER JOIN
MyData AS t2
ON t2.DOC = t1.DOC
AND t2.Ino <= t1.Ino
GROUP BY
t1.DOC,
t1.TYPE
ORDER BY 1, 3
returns
DOC TYPE Ino Seq
--- -------- -------
3a 1800xxc1 1
3a 1700xxc4 2
3a 1800xxc5 3
3a 1800xxc6 4
3b 1810xxc2 1
3b 1800xxc7 2
3c 1700xxc3 1
Problem
How can you make use of "Row number over partition by" in MS access? I googled it, but couldn't find any information as to how one would go about doing this. I'm talking about this particular function, which assigns a sequential integer to each row within the partition of a result set: ``` RowNumber Over(Partition by city Order By EmployeeID) ``` My data looks like this: ``` DOC_TYPE Ino 3a 1800xxc1 3b 1810xxc2 3c 1700xxc3 3a 1700xxc4 3a 1800xxc5 3a 1800xxc6 3b 1800xxc7 ``` However, I need it to look like this: ``` DOC_TYPE Ino Seq 3a 1800xxc1 1 3a 1700xxc4 2 3a 1800xxc5 3 3a 1800xxc6 4 3b 1810xxc2 1 3b 1800xxc7 2 3c 1700xxc3 1 ``` This is my query: ``` SELECT t1.RT_TAXCODE, t1.INV_NO, COUNT(*) AS Sno FROM GroupByTAXCODE AS t1 INNER JOIN GroupByTAXCODE AS t2 ON (t2.RT_TAXCODE = t1.RT_TAXCODE) AND (t2.Inv_no <= t1.Inv_no) GROUP BY t1.RT_TAXCODE, t1.INV_NO HAVING COUNT(*)=1 ORDER BY 1, 3; ``` This is taking more time as f 30 seconds