Mysql
 sql >> база данни >  >> RDS >> Mysql

Сравнете редове в същата таблица в mysql

Можете да извършите "самоприсъединяване" (присъединяване на таблицата към себе си), за да изпълнявате заявки. Трудната част тук е да се знае реда, в който редовете са били вмъкнати в таблицата, и да се сравняват само редове, които са последователно (времево) съседни. Предполагам, че имате някаква колона TIMESTAMP, която ще ви каже кои промени в цената са дошли след предишните. Ако не, тогава може би „ID“ може да ви информира за това (по-големият ред се вмъква след по-малкия).

Извиквайки вашата таблица 'TAB', използвайки 'TRADER' за предоставяне на присъединяването и използвайки 'ID' за предоставяне на поръчката, заявката ще изисква тристранно самостоятелно присъединяване, както следва:

SELECT a.trader
     , SUM(IF(a.price > b.price, 1, 0)) nbr_incr
     , SUM(IF(a.price < b.price, 1, 0)) nbr_decr
     , SUM(IF(a.price = b.price, 1, 0)) nbr_same
  FROM tab a
  JOIN tab b 
    ON a.trader = b.trader AND a.id > b.id
  LEFT OUTER JOIN tab c 
    ON a.trader = c.trader AND a.id > c.id AND b.id < c.id
 WHERE c.id IS NULL
 GROUP BY a.trader

Горната заявка свързва таблицата със себе си два пъти, така че всеки раздел представлява следното:

  • tab a :По-скорошният ред за сравнение
  • tab b :Непосредствено предходният ред за сравнение
  • раздел c :Ред между a и b по време (не трябва да съществува)

Ние изпълняваме LEFT OUTER JOIN към 'tab c', защото всъщност не искаме този ред да съществува. В клаузата where ние филтрираме нашите резултати само до резултатите, при които ред „tab c“ не съществува.

Накрая, заявката извършва 'GROUP BY' на търговеца и SUM()'s увеличава и намалява, като сравнява цената от редовете 'a' и 'b'.

Това беше забавно предизвикателство. Надявам се това да помогне!

Джон...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP/MySQL разлика в датата/часа

  2. Преброяване на дублирани записи в Mysql таблица?

  3. Как да получите редов ранг?

  4. 'ОПЦИЯ SQL_SELECT_LIMIT=DEFAULT'

  5. Актуализирайте/увеличете една колона на няколко реда наведнъж