соединение двух таблиц не работает должным образом - PullRequest
0 голосов
/ 21 октября 2018

Я работаю над этим уже около двух дней и, похоже, не могу понять, поэтому я хотел бы немного помочь.

У меня есть две таблицы:

mysql> select id, date, volume, symbol_id  from control_quotedaily limit 5;
+-------+---- -------+----------+-----------+
| id    | date       | volume   | symbol_id |
+-------+------------+----------+-----------+
| 13263 | 2017-11-02 |  7800191 | AXISBANK  |
| 13264 | 2017-11-02 |  9303981 | SBIN      |
| 13265 | 2017-11-02 |  8013536 | HDFCBANK  |
| 13266 | 2017-11-03 |  9642624 | AXISBANK  |
| 13267 | 2017-11-04 | 19642327 | AXISBANK  |
+-------+------------+----------+-----------+
5 rows in set (0.00 sec)
14 rows in set (0.01 sec)

mysql> select * from control_oidaily
+-----------+------------+-------------+--------------+
| symbol_id | date       | expiry_date | val_in_lakhs |
+-----------+------------+-------------+--------------+
| AXISBANK  | 2017-11-02 | 2017-11-30  |     166881.8 |
| AXISBANK  | 2017-11-02 | 2017-12-28  |      2676.84 |
| AXISBANK  | 2017-11-02 | 2018-01-25  |        97.13 |
| HDFCBANK  | 2017-11-02 | 2017-11-30  |     76351.11 |
| HDFCBANK  | 2017-11-02 | 2017-12-28  |      1509.48 |
| HDFCBANK  | 2017-11-02 | 2018-01-25  |            0 |
| SBIN      | 2017-11-02 | 2017-11-30  |      88654.3 |
| SBIN      | 2017-11-02 | 2017-12-28  |      1060.51 |
| SBIN      | 2017-11-02 | 2018-01-25  |            0 |
| AXISBANK  | 2017-11-03 | 2017-11-30  |     87640.06 |
+-----------+------------+-------------+--------------+

Так что длякаждая цитата в таблице control_quotedaily это то, что я хочу:

  1. ближайшая дата expiry_date для этой цитаты из таблицы control_oidaily
  2. Я хочу val_in_lakhs для этой даты expiry.

Например: для даты 2017-11-02 ближайший срок действия - 2017-11-30, и я хочу вернуть val_in_lakhs (76351.11).

Это то, что я пытаюсь:

select o.date, o.expiry_date as expiry_date, o.symbol_id, q.date, q.symbol_id, o.val_in_lakhs, q.tottrdval, q.volume, q.symbol_id
FROM control_oidaily o
JOIN ( select o.date, MIN(expiry_date) as expiry_date, symbol_id
    FROM control_oidaily o
    GROUP by o.date,o.symbol_id                 
    ORDER BY o.date asc) as ed
ON ed.date = o.date 
    AND ed.symbol_id = o.symbol_id
    AND ed.expiry_date = o.expiry_date
JOIN control_quotedaily q
ON q.date = ed.date
    AND q.symbol_id = ed.symbol_id

Это ожидаемый вывод:

+-------+------------+----------+-----------+--------------+--------------+
| id    | date       | volume   | symbol_id | expiry_date  | val_in_lakhs |
+-------+------------+----------+-----------+--------------+--------------+
| 13263 | 2017-11-02 |  7800191 | AXISBANK  | 2017-11-30   |     166881.8 |
| 13264 | 2017-11-02 |  9303981 | SBIN      | 2017-11-30   |      88654.3 |
| 13265 | 2017-11-02 |  8013536 | HDFCBANK  | 2017-11-30   |     76351.11 |
| 13266 | 2017-11-03 |  9642624 | AXISBANK  | 2017-11-30   |     87640.06 |
+-------+------------+----------+-----------+--------------+--------------+

1 Ответ

0 голосов
/ 21 октября 2018
  • В производной таблице получите closest_expiry_date (минимальное значение expiry_date) для группировки symbol_id и date из таблицы control_oidaily.
  • Соедините это с таблицей control_quotedaily в symbol_id и date, чтобы получить значение closest_expiry_date для каждой строки в таблице control_quotedaily.
  • Теперь снова используйте ту же производную таблицуобъединить с таблицей control_oidaily, сопоставив с date, expiry_date (с ближайшей датой истечения) и symbol_id, чтобы получить val_in_lakhs.

Возможно, вам понадобится следующий запрос:

SELECT q.id, 
       q.`date`, 
       q.volume, 
       q.symbol_id, 
       o1.expiry_date, 
       o1.val_in_lakhs 
FROM control_quotedaily AS q 
JOIN (SELECT o2.`date`, 
             o2.symbol_id
             MIN(o2.expiry_date) as closest_expiry_date              
      FROM control_oidaily AS o2
      GROUP by o2.`date`, o2.symbol_id                 
     ) AS dt 
  ON dt.`date` = q.`date` 
     AND dt.symbol_id = q.symbol_id
JOIN control_oidaily AS o1 
  ON dt.`date` = o1.`date`
     AND dt.symbol_id = o1.symbol_id 
     AND dt.closest_expiry_date = o1.expiry_date 
...