Solved

Sql query to compare where rows have the same value in different columns

Posted on 2014-04-02
9
7,481 Views
Last Modified: 2014-04-02
Have a sample table as follows:

  ID     Old    New
123       a         b
123       b         a
456       a         b
456       b         c

Would like to write a query to select where an ID has the same Old value as it does a New value.

Basically, looking for where the old value was changed and then changed back to the current value, and what those 2 values would be.

So the result set I want back is:

  ID     Old    New    Newest
123      a          b          a

I would not want to get any of the 456 IDs back because that went from a to b to c, not back to a again.

Hope this is enough information.

Thanks!
0
Comment
Question by:flip4h
  • 3
  • 3
  • 3
9 Comments
 
LVL 73

Expert Comment

by:sdstuber
ID: 39972642
how do we know the order of the rows?


123       a         b
123       b         a

could just as easily be

123       b         a
123       a         b


we have no way of knowing by looking at your data whether it changed from A to B to A
or from B to A to B
0
 
LVL 73

Accepted Solution

by:
sdstuber earned 500 total points
ID: 39972647
If we can make the assumption that order should be alphabetical based on the "old" column then try this...


SELECT o.old, o.new, n.new
  FROM yourtable o, yourtable n
 WHERE o.id = n.id AND o.new = n.old AND n.old > o.old

If there is some other criteria for determining which row came first, then please elaborate
0
 
LVL 31

Expert Comment

by:awking00
ID: 39972662
Is there any sort of change date available or perhaps some other indicator as to the order of change?
0
 

Author Comment

by:flip4h
ID: 39972693
Thanks for looking into this.

Yes, there would be a change date associated, I created a dummy "table" for this example.  Just think the order it is in is the indicator of change, added a Change# as the indicator:

So table could be this:

  ID     Change#    Old    New
123         1             a         b
123         2             b         a
456         1             a         b
456         2             b         c
0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 
LVL 31

Expert Comment

by:awking00
ID: 39972713
Is it possible for it to be something like this?
123         1             a         b
123         2             b         a
456         1             a         b
456         2             b         c
456         2             c         b  (or a)
0
 
LVL 31

Expert Comment

by:awking00
ID: 39972719
The last line should have had a Change# of 3
0
 

Author Comment

by:flip4h
ID: 39972749
Yes that scenario would be possible.

A little more background on scenario

This table is an audit table, when a change is made, a new record is created.  So could have numerous change#.  Trying to find out if an ID is being changed and then changed back.  So it would not matter what change# it is, just whether or not for the same ID if that record had an old value that matched the new value (but going at least in the order of the change#).

So in the scenario you just gave, no matter if that chnage# 3 has a or b as its new value, it would need to show.

Because
Change# 1 has a as old value
Change# 2 has b as old value
So if Change# 3 has a as new value, then because 3 > 1 and change# 1 old = change# 3 new, then it would show
If Change# 3 has b as new value, then because 3 > 2 and change# 2 old = change# 3 new, then it would show
Hope this explains it more!

Thanks again.
0
 

Author Comment

by:flip4h
ID: 39972803
Which I believe using sdstuber's query, and modifying it to look like:

SELECT o.old, o.new, n.new
  FROM yourtable o, yourtable n
 WHERE o.task_id = n.task_id AND o.old_value = n.new_value and o.change# < n.change#

Should give me exactly what I need then, correct?
0
 
LVL 73

Expert Comment

by:sdstuber
ID: 39972866
yes


  the only thing missing from my query was the sorting rule, so I made up my own.

If you have a change# to use for sorting, then, as noted above, use that
0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

If you find yourself in this situation “I have used SELECT DISTINCT but I’m getting duplicates” then I'm sorry to say you are using the wrong SQL technique as it only does one thing which is: produces whole rows that are unique. If the results you a…
PL/SQL can be a very powerful tool for working directly with database tables. Being able to loop will allow you to perform more complex operations, but can be a little tricky to write correctly. This article will provide examples of basic loops alon…
This video shows how to Export data from an Oracle database using the Original Export Utility.  The corresponding Import utility, which works the same way is referenced, but not demonstrated.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now