соедините 2 таблицы, чтобы привести несколько столбцов, используя некоторый случай

У меня есть стол table1

 pid_x | pid_y | count
-------|-------|-------
 a     | b     |  5
 a     | c     | 10
 b     | a     | 20
 c     | e     |  3
 d     | g     |  7
 e     | f     | 10
 e     | b     | 20

и так далее (более 1 миллиона строк)

Также у меня есть master_table
который состоит из деталей

 master_id | pid | rating_pid | price_pid
-----------|-----|------------|-----------
 a         | a1  |          2 | 10
 a         | b1  |          4 | 20
 a         | c1  |          1 | 30
 b         | d1  |        3.5 | 40
 b         | e1  |        2.4 | 50
 c         | f1  |        1.5 | 60
 d         | g1  |        3.8 | 70

(и так далее, огромный стол master_table)

вы можете увидеть в table1, pid_x и pid_y имеют некоторые значения, которые на самом деле master_id (от master_table), и я хочу заменить master_id на самый дешевый «pid» для этого master_idв pid_x и pid_y

То, что я ищу, это final_table
который имеет столбцы

pid_x pid_y count price_pid_y rating_pid_y price_diff_pidy/x

Объяснение.

создайте окончательную таблицу, которая имеет столбцы pid_xи pid_yпосле замены значений master_id на самый дешевый pid из master_table, а затем присоедините price and ratingpid_y изmaster_table's pid, а также процент разницы в цене pid_y по отношению к pid_x.

final_table должно выглядеть примерно так

 pid_x | pid_y | count | price_pid_y | rating_pid_y | price_diff_pid_y/x
-------|-------|-------|-------------|--------------|--------------------
 a1    | d1    |     5 |          40 |          3.5 |              400
 a1    | f1    |    10 |          60 |          1.5 |              600
 d1    | a1    |    20 |          10 |            2 |               25

У меня есть частичное решение, которое дает мне результат,

я просто хочу добавить это условие»всякий раз, когда в table1 pid_x и pid_y есть значения, которые из master_id заменяют его самым дешевым pid из master_table».

SELECT
  t1.pid_x
  ,t1.pid_y
  ,t1.count
  ,m1.price_pid AS price_pid_y
  ,m1.rating_pid AS rating_pid_y
  ,100 * m1.price_pid / m2.price_pid AS price_diff_pid_y_x
FROM table1 t1
    INNER JOIN master_table m1 ON t1.pid_y = m1.pid
    INNER JOIN master_table m2 ON t1.pid_x = m2.pid
ORDER BY
  t1.pid_x
  ,t1.pid_y

Давая какой-то случай, как

INNER JOIN master_table m1 
ON CASE WHEN A.pid_x = B.master_id

затем замените этот pid_x самым дешевым pid dor, который mater_id……`

1 ответ

  1. Хорошо, я думаю, что я понимаю, поэтому я собираюсь сделать этот шаг за шагом, так что вы можете узнать, как это сделать и исправить пятна, которые я не понял.

    Во-первых, вы хотите «самые дешевые цены», когда вы смотрите вещи на главном столе. Давайте сделаем запрос, чтобы получить только эту таблицу.

    Сначала мы получаем уникальный идентификатор для этой строки:

     SELECT master_id, min(price_pid) as price_pid
     FROM master_table
     GROUP BY master_id
    

    Затем мы можем выбрать ту новую таблицу, которая имеет только один 1, который является самым дешевым:

    SELECT ma.* 
    FROM master_table ma
    JOIN (
      SELECT master_id, min(price_pid) as price_pid
      FROM master_table
      GROUP BY master_id
    ) as mi_ma on ma.master_id = mi_ma.master_id and ma.price_pid = mi_ma.price_pid
    

    Теперь я бы создал это как представление, подобное этому:

    CREATE OR REPLACE VIEW min_master_table AS
      SELECT ma.* 
      FROM master_table ma
      JOIN (
        SELECT master_id, min(price_pid) as price_pid
        FROM master_table
        GROUP BY master_id
      ) as mi_ma on ma.master_id = mi_ma.master_id and ma.price_pid = mi_ma.price_pid
    

    С этим новым представлением ваш запрос очень близок, здесь он исправлен:

    SELECT
      m1.pid as pid_x,
      m2.pic as pid_y,
      t1.count,
      m2.price_pid AS price_pid_y,
      m2.rating_pid AS rating_pid_y,
      100 * m2.price_pid / m1.price_pid AS price_diff_pid_y_x
    FROM table1 t1
    JOIN min_master_table m1 ON t1.pid_x = m1.pid
    JOIN min_master_table m2 ON t1.pid_y = m2.pid
    

    Примечание: Если вы не можете сделать вид, это также будет работать, но он гораздо более подвержен ошибке из-за дублирования кода:

    SELECT
      m1.pid as pid_x,
      m2.pic as pid_y,
      t1.count,
      m2.price_pid AS price_pid_y,
      m2.rating_pid AS rating_pid_y,
      100 * m2.price_pid / m1.price_pid AS price_diff_pid_y_x
    FROM table1 t1
    JOIN (
      SELECT ma.* 
      FROM master_table ma
      JOIN (
        SELECT master_id, min(price_pid) as price_pid
        FROM master_table
        GROUP BY master_id
      ) as mi_ma on ma.master_id = mi_ma.master_id and ma.price_pid = mi_ma.price_pid
    ) m1 ON t1.pid_x = m1.pid
    JOIN (
      SELECT ma.* 
      FROM master_table ma
      JOIN (
        SELECT master_id, min(price_pid) as price_pid
        FROM master_table
        GROUP BY master_id
      ) as mi_ma on ma.master_id = mi_ma.master_id and ma.price_pid = mi_ma.price_pid
    ) m2 ON t1.pid_y = m2.pid