How to get RowNumber() with Partition in MYSQL
Asked Answered
W

2

2

RowNumber() with Partition in MYSQL

i want the below output based on id-Foreign key

 id | Name | rownumber
 1     a      1
 1     b      2
 1     ads    3    
 2    dsfs    1  
 2    sadf    2
 2    sdfsa   3
 2    dfsfs   4 
 3     dsf    1
 3     adsf   2
 3     sdd    3 
Walleyed answered 25/10, 2013 at 12:18 Comment(2)
Post your original data.Brycebryn
possible duplicate of ROW_NUMBER() in MySQL and several other questions looking for "window functions" in MySQL.Britain
J
4

I barely understood what you mean. There's no RowNumber() function in mysql, and partitioning has nothing to do with your request.

It's:

SELECT 
  t.*, 
  @cur:= IF(id=@id, @cur+1, 1) AS RowNumber, 
  @id := id 
FROM 
  t CROSS JOIN 
    (SELECT @id:=(SELECT MIN(id) FROM t), @cur:=0) AS init 
ORDER BY 
  t.id
Justinajustine answered 25/10, 2013 at 12:28 Comment(0)
T
3

@Alma Du, @Chintu is talking about SQL Server where you can apply row_number + partition over specific field(s).

Practical Example: Imagine that you have a table - named 'customerPurchasesHist' - that stores customer's purchases history:

| customerNr | purchaseItem | purchaseDatetime |
| 123        | microwave    | 2014-06-05       |
| 123        | television   | 2014-09-10       |
| 123        | fridge       | 2015-01-10       |
| 1234       | sofa         | 2015-01-10       | 
(....)

In SQL Server, if you need to get the last two purchases from each client on that table, all you have to do is:

SELECT * FROM (
   SELECT h.*, ROW_NUMBER() OVER (PARTITION BY customerNr ORDER BY purchaseDatetime DESC) AS sequence 
   FROM customerPurchasesHist h
)T
WHERE 1=1
AND seq <= 2
;

The result will be:

| customerNr | purchaseItem | purchaseDatetime | seq |
| 123        | fridge       | 2015-01-10       |  1  |
| 123        | television   | 2014-09-10       |  2  |
| 1234       | sofa         | 2015-01-10       |  1  |
Twelfthtide answered 16/10, 2015 at 11:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.