Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL zum Überprüfen, wenn Paare nicht übereinstimmen

Eine Möglichkeit ist die Verwendung von exists Prädikat mit einer korrelierten Unterabfrage, die prüft, ob das spezifische Symbol mehr als einen Preis hat.:

select * from table1 t
where exists (
  select 1
  from table1
  where symbol = t.symbol
  and price <> t.price);

Beispiel-SQL-Fiddle

Dies würde zurückgeben:

|                   Date | Type |    Symbol |  Price |
|------------------------|------|-----------|--------|
| June, 30 1995 02:00:00 | gaus | 313586U72 | 109.25 |
| June, 30 1995 02:00:00 | gbus | 313586U72 | 108.94 |
| June, 30 1995 02:00:00 | agus |       SRR |  10.25 |
| June, 30 1995 02:00:00 | lcus |       SRR |   0.45 |
| July, 01 1995 02:00:00 | gaus | 313586U72 | 109.25 |
| July, 01 1995 02:00:00 | gbus | 313586U72 | 108.94 |

Bearbeiten:Inspiriert von Gordon Linoffs cleverer Antwort könnte eine andere Option darin bestehen, avg() zu verwenden als Fensterfunktion:

select Date, Type, Symbol, Price  
from (
  select Date, Type, Symbol, Price, avg = avg(price) over (partition by symbol) 
  from table1) a
where avg <> price;

Bearbeiten:mit einer Überprüfung, um sicherzustellen, dass nur Duplikate am selben Datum zurückgegeben werden:http:/ /www.sqlfiddle.com/#!6/29d67/1