Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

Posted on 2014-10-12
Medium Priority
323 Views
I would like to return the last record in a group and the previous row proceeding the last row.  I was wondering if anyone new how to use ranking or partioning to solve this problem in sql statement.
example 1
member       date        amount
1111            01/14         20.00
1111            02/14         15.00
1111            03/14         50.00
2222            07/13         10.00
2222            01/14         15.00
3333            01/08         20.00
3333            01/09         50.00
3333            01/12         75.00
3333            01/13         80.00

Results
member       date        amount
1111            02/14         15.00
1111            03/14         50.00

2222            07/13         10.00
2222            01/14         15.00

3333            01/12         75.00
3333            01/13         80.00
0
Question by:centralmike
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points

LVL 41

Accepted Solution

Sharath earned 2000 total points
ID: 40376113
try this.
``````SELECT t2.member,t2.date,t2.amount
FROM (SELECT t1.*,
ROW_NUMBER() OVER (PARTITION BY t1.member ORDER BY t1.date DESC)
FROM your_table t1) t2
WHERE t2.rn <= 2
``````
0

LVL 40

Expert Comment

ID: 40380133
You mean something like this?

create table test_table (member int, crtdate Date, amount money)

insert into test_table select 1111, '01/01/14', 20.00
insert into test_table select 1111, '02/01/14', 15.00
insert into test_table select 1111, '03/01/14', 50.00

insert into test_table select 2222, '07/01/13', 10.00
insert into test_table select 2222, '01/01/14', 15.00
insert into test_table select 3333, '01/01/08', 20.00
insert into test_table select 3333, '01/01/09', 50.00
insert into test_table select 3333, '01/01/12', 75.00
insert into test_table select 3333, '01/01/13', 80.00

select * from
(
SELECT t2.rn,t2.member,t2.crtdate,t2.amount
FROM (SELECT t1.member,t1.crtdate,t1.amount,
ROW_NUMBER() OVER (PARTITION BY t1.member ORDER BY t1.crtdate) as rn
FROM test_table t1) t2
) tl
WHERE rn > (select (max(rn) - 2) from
(
SELECT t2.rn,t2.member,t2.crtdate,t2.amount
FROM (SELECT t1.member,t1.crtdate,t1.amount,
ROW_NUMBER() OVER (PARTITION BY t1.member ORDER BY t1.crtdate) as rn
FROM test_table t1) t2
) b
WHERE member = tl.member GROUP BY member)
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this series, we will discuss common questions received as a database Solutions Engineer at Percona. In this role, we speak with a wide array of MySQL and MongoDB users responsible for both extremely large and complex environments to smaller singl…
In today's business world, data is more important than ever for informing marketing campaigns. Accessing and using data, however, may not come naturally to some creative marketing professionals. Here are four tips for adapting to wield data for insi…
Using examples as well as descriptions, step through each of the common simple join types, explaining differences in syntax, differences in expected outputs and showing how the queries run along with the actual outputs based upon a simple set of dem…
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
###### Suggested Courses
Course of the Month9 days, 23 hours left to enroll