ルックアップ列を変更した場合のMySQLルックアップの最も近い値または完全に一致する値

ジョシュ

私は次のデータセットを持っています...

状態監視ロケーションデータ(CMLテーブル)

+--------+--------------------+--------------------+--------------+------------+--------------------+-------+-----+
| CML_ID |     POF_COLUMN     |      CML_TYPE      | SAMPLE_VALUE | COMPLIANCE | CORROSION_SEVERITY | LR_LD | POF |
+--------+--------------------+--------------------+--------------+------------+--------------------+-------+-----+
|      1 | SAMPLE_VALUE       | MIC_SAMPLING_POINT |            5 | NO         | MINOR              |     1 |     |
|      2 | SAMPLE_VALUE       | MIC_SAMPLING_POINT |          0.5 | NO         | MINOR              |     2 |     |
|      3 | SAMPLE_VALUE       | MIC_SAMPLING_POINT |           20 | NO         | MINOR              |     3 |     |
|      4 | COMPLIANCE         | VALVE_ROTATED      |            0 | YES        | MINOR              |     4 |     |
|      5 | LR_LD              | PIPING_THICKNESS   |            0 | YES        | MINOR              |   0.1 |     |
|      6 | CORROSION_SEVERITY | VESSEL_SHELL       |            0 | NO         | SEVERE             |     0 |     |
|      7 | CORROSION_SEVERITY | NOZZLE             |            0 | NO         | LOW                |     0 |     |
+--------+--------------------+--------------------+--------------+------------+--------------------+-------+-----+

障害ルックアップデータの確率(POFテーブル)

+--------------------+--------------------+-------------+-----+
|     POF_COLUMN     |      CML_TYPE      | VALUE_RANGE | POF |
+--------------------+--------------------+-------------+-----+
| SAMPLE_VALUE       | MIC_SAMPLING_POINT | 1           |   5 |
| SAMPLE_VALUE       | MIC_SAMPLING_POINT | 5           |   4 |
| SAMPLE_VALUE       | MIC_SAMPLING_POINT | 10          |   3 |
| SAMPLE_VALUE       | MIC_SAMPLING_POINT | 15          |   2 |
| SAMPLE_VALUE       | MIC_SAMPLING_POINT | 100         |   1 |
| COMPLIANCE         | VALVE_ROTATED      | YES         |   5 |
| COMPLIANCE         | VALVE_ROTATED      | NO          |   1 |
| LR_LD              | PIPING_THICKNESS   | 2           |   5 |
| LR_LD              | PIPING_THICKNESS   | 1.5         |   4 |
| LR_LD              | PIPING_THICKNESS   | 1           |   3 |
| LR_LD              | PIPING_THICKNESS   | 0.8         |   2 |
| LR_LD              | PIPING_THICKNESS   | 0.5         |   1 |
| CORROSION_SEVERITY | VESSEL_SHELL       | NEGLIGIBLE  |   5 |
| CORROSION_SEVERITY | VESSEL_SHELL       | LOW         |   4 |
| CORROSION_SEVERITY | VESSEL_SHELL       | MEDIUM      |   3 |
| CORROSION_SEVERITY | VESSEL_SHELL       | HIGH        |   2 |
| CORROSION_SEVERITY | VESSEL_SHELL       | SEVERE      |   1 |
| CORROSION_SEVERITY | NOZZLE             | NEGLIGIBLE  |   5 |
| CORROSION_SEVERITY | NOZZLE             | LOW         |   5 |
| CORROSION_SEVERITY | NOZZLE             | MEDIUM      |   5 |
| CORROSION_SEVERITY | NOZZLE             | HIGH        |   3 |
| CORROSION_SEVERITY | NOZZLE             | SEVERE      |   2 |
+--------------------+--------------------+-------------+-----+

また、CMLの各CMLレコードの[POF_Column]、[CML_Type]、および[SAMPLE_VALUE]、[COMPLIANCE]、[CORROSION_SEVERITY]、[LR_LD]のいずれかのフィールドを使用して、POFテーブルのクローゼットまたは完全に一致するレコードを返す必要がありますテーブル。次に、POFをCMLテーブルに記録するように更新します。

たとえば、CML_ID = 2を見ると。

[POF_COLUMN] = 'SAMPLE_VALUE'、[CML_TYPE] = 'MIC_SAMPLING_POINT'および[VALUE_RANGE]でPOFテーブルをフィルタリングします-[SAMPLE_VALUE]列の値(この場合は0.5)は最小です。

この場合、POFテーブルのこの最初のレコードと一致し、POF = 5の値を返します。

別のケースを見ると。CML_ID = 7。

[POF_COLUMN] = 'CORROSION_SEVERITY'、[CML_TYPE] = 'NOZZLE'、[VALUE_RANGE] = [CORROSION_SEVERITY]列の値(この場合は 'LOW')でPOFテーブルをフィルタリングします。

この場合、POFテーブルの下から4番目の行に一致し、POF = 5の値を返します。

要約すると、次の結果を表示するには、CMLテーブルを更新する必要があります...

+--------+---+-----+
| CML_ID | … | POF |
+--------+---+-----+
|      1 | … |   4 |
|      2 | … |   5 |
|      3 | … |   2 |
|      4 | … |   5 |
|      5 | … |   1 |
|      6 | … |   1 |
|      7 | … |   5 |
+--------+---+-----+

誰かが私がこれを達成する方法を知っていますか?これを試みたサンプルコードを以下に示します。これは、完全に一致する値を検索するために機能しますが、最も近い一致する値を検索するためには機能しません。

DROP DATABASE IF EXISTS VESSELS;
CREATE DATABASE VESSELS;
USE VESSELS;

CREATE TABLE CML (
  `CML_ID`              INTEGER NOT NULL,
  `POF_COLUMN`          VARCHAR(50),
  `CML_TYPE`            VARCHAR(50),
  `SAMPLE_VALUE`        FLOAT,
  `COMPLIANCE`          ENUM('YES','NO'),
  `CORROSION_SEVERITY`  VARCHAR(50),
  `LR_LD`               FLOAT,
  `POF`                 TINYINT,
  PRIMARY KEY (CML_ID)
);

CREATE TABLE POF (
  `POF_COLUMN`   VARCHAR(50),
  `CML_TYPE`     VARCHAR(50),
  `VALUE_RANGE`  VARCHAR(100),
  `POF`          TINYINT,
  PRIMARY KEY (POF_COLUMN, CML_TYPE, VALUE_RANGE)
);

INSERT INTO CML 
VALUES (1, 'SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 5, 'NO', 'MINOR', 1, NULL),
       (2, 'SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 0.5, 'NO', 'MINOR', 2, NULL),
       (3, 'SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 20, 'NO', 'MINOR', 3, NULL), 
       (4, 'COMPLIANCE', 'VALVE_ROTATED', 0, 'YES', 'MINOR', 4, NULL), 
       (5, 'LR_LD', 'PIPING_THICKNESS', 0, 'YES', 'MINOR', 0.1, NULL),
       (6, 'CORROSION_SEVERITY', 'VESSEL_SHELL', 0, 'NO', 'SEVERE', 0, NULL),
       (7, 'CORROSION_SEVERITY', 'NOZZLE', 0, 'NO', 'LOW', 0, NULL);

INSERT INTO POF 
VALUES ('SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 1, 5),
       ('SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 5, 4),
       ('SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 10, 3),
       ('SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 15, 2),
       ('SAMPLE_VALUE', 'MIC_SAMPLING_POINT', 100, 1),
       ('COMPLIANCE', 'VALVE_ROTATED', 'YES', 5), 
       ('COMPLIANCE', 'VALVE_ROTATED', 'NO', 1), 
       ('LR_LD', 'PIPING_THICKNESS', 2, 5),
       ('LR_LD', 'PIPING_THICKNESS', 1.5, 4),
       ('LR_LD', 'PIPING_THICKNESS', 1, 3),
       ('LR_LD', 'PIPING_THICKNESS', 0.8, 2),
       ('LR_LD', 'PIPING_THICKNESS', 0.5, 1),
       ('CORROSION_SEVERITY', 'VESSEL_SHELL', 'NEGLIGIBLE', 5),
       ('CORROSION_SEVERITY', 'VESSEL_SHELL', 'LOW', 4),
       ('CORROSION_SEVERITY', 'VESSEL_SHELL', 'MEDIUM', 3),
       ('CORROSION_SEVERITY', 'VESSEL_SHELL', 'HIGH', 2),
       ('CORROSION_SEVERITY', 'VESSEL_SHELL', 'SEVERE', 1),
       ('CORROSION_SEVERITY', 'NOZZLE', 'NEGLIGIBLE', 5),
       ('CORROSION_SEVERITY', 'NOZZLE', 'LOW', 5),
       ('CORROSION_SEVERITY', 'NOZZLE', 'MEDIUM', 5),
       ('CORROSION_SEVERITY', 'NOZZLE', 'HIGH', 3),
       ('CORROSION_SEVERITY', 'NOZZLE', 'SEVERE', 2);

-- UPDATE EXACT MATCHING VALUE
UPDATE CML c
LEFT JOIN POF p
ON c.POF_COLUMN = p.POF_COLUMN
   AND c.CML_TYPE = p.CML_TYPE
   AND ( (c.POF_COLUMN = 'COMPLIANCE' AND c.COMPLIANCE = p.VALUE_RANGE) OR
         (c.POF_COLUMN = 'SAMPLE_VALUE' AND c.SAMPLE_VALUE = p.VALUE_RANGE) OR
         (c.POF_COLUMN = 'LR_LD' AND c.LR_LD = p.VALUE_RANGE) OR
         (c.POF_COLUMN = 'CORROSION_SEVERITY' AND c.CORROSION_SEVERITY = p.VALUE_RANGE)
       )
SET c.POF = p.POF;

SELECT * FROM CML;
âńōŋŷXmoůŜ

サンプルデータと期待される結果を含む非常に詳細な投稿に賛成してください。問題はsample_valueとlr_ldにあります。これは、POFテーブルの正確な値ではない可能性があるためです。ただし、値が値の範囲以下であることに気付くでしょう。

したがって、sample_valueまたはlr_ldが値の範囲以下であるPOF値の最大値を取得する場合は、POF値の最大値を取得するだけで済みます。

このクエリは、sample_valueまたはlr_ldが増加するとPOF値が増加するためにのみ機能します。

UPDATE CML c
  JOIN 
(
    select c.CML_ID, max(p.POF) POF 
    from CML c
    LEFT JOIN POF p
    ON c.POF_COLUMN = p.POF_COLUMN
       AND c.CML_TYPE = p.CML_TYPE
       AND ( (c.POF_COLUMN = 'COMPLIANCE' AND c.COMPLIANCE = p.VALUE_RANGE) OR
             (c.POF_COLUMN = 'SAMPLE_VALUE' AND  c.SAMPLE_VALUE<=p.VALUE_RANGE) OR
             (c.POF_COLUMN = 'LR_LD' AND c.LR_LD  <= p.VALUE_RANGE) OR
             (c.POF_COLUMN = 'CORROSION_SEVERITY' AND c.CORROSION_SEVERITY = p.VALUE_RANGE)
           )
     group by c.CML_ID 
   ) t
 on c.CML_ID = t.CML_ID
set c.POF = t.POF;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ルックアップ列を変更した場合のMySQLルックアップの最も近い値または完全に一致する値

分類Dev

別の列に最も近い一致である複数の列からのルックアップ値

分類Dev

ルックアップ値がテーブルまたは範囲内の対応する値よりも長い場合の部分一致

分類Dev

R ルックアップは値間を補間するか、最も近い一致

分類Dev

一致するものが見つからない場合、ルックアップExcelは最小値を返します

分類Dev

Excelは、指定されたルックアップ値に最も近い大きな値を列で検索します

分類Dev

Excelインデックスの一致、日付が一致する場合のルックアップ値、またはその日付の週番号が一致しますか?

分類Dev

一致またはルックアップなしで文字列を列挙型に変換する寓話

分類Dev

ソートされた数値インデックスと列を持つDataFrameの場合、渡された指定された値に最も近いインデックス値と列名のタプルを返します

分類Dev

ルックアップ値がルックアップ配列にある場合のインデックス一致

分類Dev

ルックアップし、テーブル1に一致するものがない場合は、テーブル2をルックアップします。

分類Dev

Daskで列の値を結合/ルックアップ/マップする最も効率的な方法は?

分類Dev

単一の結果を取得するには、複数のルックアップ値でインデックスと一致を使用します

分類Dev

df結合またはルックアップの文字列%in%に基づくルックアップ値?

分類Dev

ルックアップ値よりも大きいリストの最初の値に対応する変数をルックアップします

分類Dev

最も近い日付に対応するルックアップ値

分類Dev

コンボボックスの値がサンプルの場合、サンプルに一致する列を検索します

分類Dev

ハッシュマップの一組の値が他のペアのキーと一致した場合に対処する方法はありますか?

分類Dev

集計に一致するMongodbルックアップは、空の配列を返します

分類Dev

ssisは、ルックアップテーブルと一致する場合、データフロー内のいくつかの値をスワップします

分類Dev

「タイプを含む」一致を使用して複数の値を返すように vlookup する方法 (検索文字列はルックアップ値のどこにでも表示できます)

分類Dev

Kivy-ポップアップで変更されたオブジェクトの値を保存するため、オブジェクトを閉じた後、もう一度ポップアップを開くと、新しい値で開きます

分類Dev

ルックアップでカテゴリIDと一致する場合にのみExcelで値を合計する方法

分類Dev

文字列が一致し、セルのセット内で最後に一致する文字列である場合、Googleスプレッドシートはそれにセルネストの値を取得します

分類Dev

変数と一致する別の列からのルックアップ値

分類Dev

Python-特定のルックアップ文字列に一致する値を持つ辞書キーの数をカウントします

分類Dev

Djangoでの__inまたは__containsルックアップの一致数を計算します

分類Dev

ドロップボックスの特定の文字列と一致した場合にのみ、特定のセルを合計します

分類Dev

MySQLは別のルックアップ値をSUM値に追加します

Related 関連記事

  1. 1

    ルックアップ列を変更した場合のMySQLルックアップの最も近い値または完全に一致する値

  2. 2

    別の列に最も近い一致である複数の列からのルックアップ値

  3. 3

    ルックアップ値がテーブルまたは範囲内の対応する値よりも長い場合の部分一致

  4. 4

    R ルックアップは値間を補間するか、最も近い一致

  5. 5

    一致するものが見つからない場合、ルックアップExcelは最小値を返します

  6. 6

    Excelは、指定されたルックアップ値に最も近い大きな値を列で検索します

  7. 7

    Excelインデックスの一致、日付が一致する場合のルックアップ値、またはその日付の週番号が一致しますか?

  8. 8

    一致またはルックアップなしで文字列を列挙型に変換する寓話

  9. 9

    ソートされた数値インデックスと列を持つDataFrameの場合、渡された指定された値に最も近いインデックス値と列名のタプルを返します

  10. 10

    ルックアップ値がルックアップ配列にある場合のインデックス一致

  11. 11

    ルックアップし、テーブル1に一致するものがない場合は、テーブル2をルックアップします。

  12. 12

    Daskで列の値を結合/ルックアップ/マップする最も効率的な方法は?

  13. 13

    単一の結果を取得するには、複数のルックアップ値でインデックスと一致を使用します

  14. 14

    df結合またはルックアップの文字列%in%に基づくルックアップ値?

  15. 15

    ルックアップ値よりも大きいリストの最初の値に対応する変数をルックアップします

  16. 16

    最も近い日付に対応するルックアップ値

  17. 17

    コンボボックスの値がサンプルの場合、サンプルに一致する列を検索します

  18. 18

    ハッシュマップの一組の値が他のペアのキーと一致した場合に対処する方法はありますか?

  19. 19

    集計に一致するMongodbルックアップは、空の配列を返します

  20. 20

    ssisは、ルックアップテーブルと一致する場合、データフロー内のいくつかの値をスワップします

  21. 21

    「タイプを含む」一致を使用して複数の値を返すように vlookup する方法 (検索文字列はルックアップ値のどこにでも表示できます)

  22. 22

    Kivy-ポップアップで変更されたオブジェクトの値を保存するため、オブジェクトを閉じた後、もう一度ポップアップを開くと、新しい値で開きます

  23. 23

    ルックアップでカテゴリIDと一致する場合にのみExcelで値を合計する方法

  24. 24

    文字列が一致し、セルのセット内で最後に一致する文字列である場合、Googleスプレッドシートはそれにセルネストの値を取得します

  25. 25

    変数と一致する別の列からのルックアップ値

  26. 26

    Python-特定のルックアップ文字列に一致する値を持つ辞書キーの数をカウントします

  27. 27

    Djangoでの__inまたは__containsルックアップの一致数を計算します

  28. 28

    ドロップボックスの特定の文字列と一致した場合にのみ、特定のセルを合計します

  29. 29

    MySQLは別のルックアップ値をSUM値に追加します

ホットタグ

アーカイブ