# Stuck on a query with row wise calculation.....

i m trying to figure out instances from a table where two rows are inserted in less than 5 mins apart for a same customer by a different user. i have tried doing the grouping by but if the same customer was called later on during the day then it gets out of that condition....... following is the sceario that would explain it more clearly....

id        customerid          dateTime                  user
1            10                    today 9:00 am           2
2            10                    today 9:02 am           3
3            15                    today 9:05 am           6
4            15                    today 9:06 am           6
5            10                    today 9:30 am           3

In the above example the query should only bring up customer id 10.... as there was atleast one instance where there are two records less than 10 minutes apart by two different users.....  If i use group by clause and go with Max and min values comparing them to be less than 10 minutes apart for the above data set i will get empty recordset....as customerid 15 was less than 10 minutes apart but was by the same user......

i hope i explained it okay...
LVL 1
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
I think it will take an self-join like:

SELECT *
FROM YourCustomerTable c1
INNER JOIN YourCustomerTable c2 ON c1.customerid = c.customerid
WHERE ABS(DATEDIFF(minute,c1.dateTime, c2.dateTime)) > 5
AND c1.user <> c2.user
0
Commented:
i do hope u do not have a column called datetime - this is a SQL reserved word and u can get into all sorts of trouble.

try
Select
c1.id,
c1.customerid,
c1.[dateTime]
c1.user
from
Customers  c1
inner join
customers c2
on
c1.customerid = c2.customerid
and
datediff(minute,c1.[datetime],c2.[datetime]) < 5
and
c1.user <> c2.user

/Richard
0
Commented:
try this:

select distinct a.customerid
from yourtable a
join yourtable b on a.customerid = b.customerid and a.user <> b.user and datediff(s, a.datetime, b.datetime) <= 60*5
0
Commented:
This query could be very expensive against a table with a lot of rows.  Most likely you should add a WHERE clause to limit the scope to a given day but keep in mind if you do that you need to account for the event happening over a day boundary.  Adding something like:

WHERE DateTime > DateAdd(DD, -1, getdate())

will only look for the event in the last 24 hours

select
FROM
MyTab T1
JOIN MyTab T2 ON
T1.ID <> T2.ID AND T1.CUSTOMERID = T2.CUSTOMERID AND
ABS(T1.DateTime - T2.DateTime) < 300 AND
T1.USER <> T2.USER
0
Author Commented:
Hello,
thank you all for your solutions... is there any way i can get around without having to do a self join.... i say this because its a huge, huge table as it records history of every transaction and doing a self join would just be disastrous.....

thanks,
0
Commented:
Frankly, this is more of an issue for a trigger.  Add a field called posted_within_5min BIT to your recordset and default it to 0.  Assume your table name is Table1:

CREATE TRIGGER ON Table1
AFTER INSERT
AS

DECLARE @id INTEGER, @customerid INTEGER
DECLARE @datetime DATETIME, @user INTEGER

SELECT
id,
customerid,
[datetime],
[user]
FROM
inserted

OPEN c1
FETCH NEXT FROM c1 INTO
@id, @customerid, @datetime, @user
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS(
SELECT * FROM Table1
WHERE
customerid = @customerid
AND
[user] <> @user
AND
DATEDIFF(mi, [datetime], @datetime) < 5
)
BEGIN
-- Update the master table as the
-- insert has already taken place
UPDATE Table1 SET
posted_within_5min = 1
WHERE
id = @id
END
FETCH NEXT FROM c1 INTO
@id, @customerid, @datetime, @user
END

This trigger is good for one insertion or a batch insertion.  Old records can be marked using a batch update process, which will be long but will have to happen only once. Your query then becomes:

SELECT
*
FROM Table1
WHERE
posted_within_5min <> 0
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Author Commented:
thanks cpkilekofp!!

although at present i used the other solutions as a quick fix, but i will implement the trigger when i get a chance just coz its more clean and does not require huge database query everytime you run it. will just have to see how the trigger affects the performance of the data access and write in a work environment.

thank you all for your ideas...
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Databases

From novice to tech pro — start learning today.