We're Moving!

The Vertica Forum is moving to a new OpenText Analytics Database (Vertica) Community.

Join us there to post discussion topics, learn about

product releases, share tips, access the blog, and much more.

Create My New Community Account Now


How to find the second row in a table? — Vertica Forum

How to find the second row in a table?

Is there a way to write SQL to get all clients second purchases in a table? (Sorting rows by date)

Table Transaction
  clientid  int
  buy_date  date 
  amount  int

I prefer to use the Analytic functions, perhaps using count() over()?



Comments

  • Abhishek_RanaAbhishek_Rana Vertica Employee Employee
    We can use RANK() OVER Partition for this :

    Suppose you have following data in your table:
    =================================

    dbadmin=> select * from Transaction order by 1,2;

     clientid |  buy_date  | amount 
     ----------+------------+--------         
    1 | 2013-01-01 |    200         
    1 | 2013-01-04 |    300         
    1 | 2013-01-06 |    400         
    2 | 2013-01-06 |    400         
    2 | 2013-02-06 |    500         
    2 | 2013-02-07 |    600         
    3 | 2013-02-03 |    600         
    3 | 2013-02-04 |    600         
    3 | 2013-02-05 |   1200

    You can get get all clients second purchases as below:
    =======================================

    dbadmin=> select * from ( 
                        SELECT clientid, buy_date,amount, rank() 
                        OVER(PARTITION BY clientid 
                        ORDER BY buy_date) As RANKING 
                        FROM Transaction 
                                            ) as Trans where Trans.RANKING=2 
                        order by 1;

    clientid |  buy_date  | amount | RANKING
    ----------+------------+--------+---------
    1 | 2013-01-04 |    300 |       2         
    2 | 2013-02-06 |    500 |       2       
     3 | 2013-02-04 |    600 |      2

    (3 rows)

    Regards'

    Abhishek

  • Navin_CNavin_C Vertica Customer
    Adding to the solution

    if you want to know the second purchase of a client for a every day basis.

      select * from ( 
                        SELECT clientid, buy_date,amount, rank() 
                        OVER(PARTITION BY clientid,buy_date 
                        ORDER BY buy_date) As RANKING 
                        FROM Transaction 
                                            ) as Trans where Trans.RANKING=2 
                        order by 1;

    Hope this helps

Leave a Comment

BoldItalicStrikethroughOrdered listUnordered list
Emoji
Image
Align leftAlign centerAlign rightToggle HTML viewToggle full pageToggle lights
Drop image/file