sql >> Database >  >> RDS >> Sqlserver

SQL om te controleren wanneer paren niet overeenkomen

Een manier is om de exists . te gebruiken predikaat met een gecorreleerde subquery die controleert of het specifieke symbool meer dan één prijs heeft.:

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

Voorbeeld SQL-fiddle

Dit zou terugkeren:

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

Bewerken:geïnspireerd door het slimme antwoord van Gordon Linoff. Een andere optie zou kunnen zijn om avg() te gebruiken als een vensterfunctie:

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

Bewerken:met een controle om ervoor te zorgen dat alleen duplicaten op dezelfde datum worden geretourneerd:http:/ /www.sqlfiddle.com/#!6/29d67/1



  1. De beste manier in MySQL of Rails om AVG per dag binnen een specifiek datumbereik te krijgen

  2. Hoe ontsnap ik aan een gereserveerd woord in Oracle?

  3. frontend mysql, een rij verwijderen

  4. Microsoft SQL Server-fout:18456 + Windows-verificatie