ここから本文です

どうしても分からず質問させていただきます。

shi********さん

2019/1/600:22:29

どうしても分からず質問させていただきます。

DB: postgres
OS: windows 10 pro

現在の抽出前データ
食品A, 食品B,
みかん, みかん
りんご, みかん
みかん, りんご
すいか, りんご
りんご, りんご
りんご, すいか
すいか, みかん

希望抽出後データ
食品A, 食品B,
みかん, みかん
りんご, みかん
すいか, りんご
りんご, りんご
すいか, みかん

条件
同じ食品A及び食品Bとのペア重複を除きたい

例えば、抽出前データをみると
りんご みかんペア = みかん りんごペアですので
りんご みかんペアを残したいです。

すいか りんごペア = りんご すいかペアですので
すいか りんごペアを残したいです。

いろいろ試行錯誤しましたが、なかなかうまくいきません。
どうかよろしくお願いいたします。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
14
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nor********さん

2019/1/605:17:00

これでいいのか自信はありませんが試してください。

SELECT DISTINCT
CASE WHEN 食品A <= 食品B THEN 食品A ELSE 食品B END AS 食品A,
CASE WHEN 食品A <= 食品B THEN 食品B ELSE 食品A END AS 食品B
FROM テーブル名
ORDER BY 食品A, 食品B

求めているものと違っていたり、要件を満たしていない時は指摘ください。

  • nor********さん

    2019/1/608:34:47

    PostgreSQL固有機能になりますが以下のファンクションを作成します

    CREATE FUNCTION sort(anyarray) RETURNS anyarray AS $$
    SELECT array_agg(i ORDER BY i) FROM unnest($1) AS t(i)
    $$ LANGUAGE sql IMMUTABLE STRICT;

    with q as ( select *, sort( array[食品A,食品B] ) sort_arr from テーブル )
    ,q2 as ( select *,row_number() over(partition by sort_arr order by sort_arr) rn from q )
    select 食品A,食品B from q2 where rn = 1;

    というのも考えてみました。
    とりあえずそれっぽく動きました。
    対象項目が3~5くらいの場合使えるかもしれません。

    (*)配列型自体はSQL規格にありますが、それを操作する機能はPostgreSQLの独自実装になると思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/1/9 22:05:51

試してみます。ありがとうございました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる