sql >> Databasteknik >  >> RDS >> Sqlserver

SQL för att kontrollera när par inte matchar

Ett sätt är att använda exists predikat med en korrelerad underfråga som kontrollerar att den specifika symbolen har mer än ett pris.:

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

Exempel på SQL-fiol

Detta skulle returnera:

|                   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 |

Edit:inspirerad av Gordon Linoffs smarta svar ett annat alternativ kan vara att använda avg() som en fönsterfunktion:

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

Edit:med en kontroll för att säkerställa att endast dubbletter på samma datum returneras:http:/ /www.sqlfiddle.com/#!6/29d67/1



  1. skapa EJB Provider javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType

  2. Ta bort alla rader utom första N från en tabell med en kolumn

  3. ActiveRecord-frågan mycket långsammare än rak SQL?

  4. Sökfiltrering med PHP/MySQL