0

こんな感じのテーブルがあります。

abc-cde-0001222
abc-cde-0001223
abc-ced-0001224
cde-efg-0003001
ced-efg-0003002
ced-efg-0003008

選択したいabc-cde-0001222, abc-ced-0001224

        also cde-efg-0003001 , cde-efg-0003002

             ced-efg-0003008  , ""

ほら、範囲の最初と最後の値を取得する必要があります。特定の値が 1 つの項目のみ (範囲内ではない) の場合、最初の値と null 値として選択する必要があります。

IFこれまでのところ、andを使用するアイデアしかありませんincrement operator(これが可能な場合)。私はフォーマットを行い、Int値を取得することができます

SELECT field, CONVERT(SUBSTRING_INDEX(field,'-',-1), UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

手を貸してください...とても感謝しています

4

1 に答える 1

0

これは MySQL の苦痛です。しかし、それは可能です。ロジックは、シーケンスの開始位置を見つけることです。これは、相関サブクエリといくつかの演算を使用して行うことができます。次に、開始の累積合計が必要です。これは、相関サブクエリで相関サブクエリを実行する必要があるため、より困難です。

まず、NullIfStart変数を設定するには:

select t.*,
       (select 0
        from t t2
        where left(t2.field, 8) = left(t.field, 8) and
              t2.field < t.field and
              right(t2.field, 7) + 0 = right(t.field, 7) + 0 - 1
       ) as NullIfStart
from t;

これは、グループ化フィールドとして使用できる累積合計を取得します。

select t.*
       (select sum(NullIfStart is null)
        from (select t1.*,
                     (select 0
                      from t t2
                      where left(t2.field, 8) = left(t1.field, 8) and
                            t2.field < t1.field and
                            right(t2.field, 7) + 0 = right(t1.field, 7) + 0 - 1
                     ) as NullIfStart
               from t t1
              ) tnis
         where right(tnis.field, 7) = right(t.field, 7) and
               tnis.field <= t.field
        ) grp
from t;

最終的な解決策は、集計を行うことです。

select min(field),
       (case when max(field <> min(field) then max(field) end)
from (select t.*
             (select sum(NullIfStart is null)
              from (select t1.*,
                           (select 0
                            from t t2
                            where left(t2.field, 8) = left(t1.field, 8) and
                                  t2.field < t1.field and
                                  right(t2.field, 7) + 0 = right(t1.field, 7) + 0 - 1
                           ) as NullIfStart
                     from t t1
                    ) tnis
               where left(tnis.field, 8) = left(t.field, 8) and
                     tnis.field <= t.field
              ) grp
      from t
     ) s
group by left(s.field, 8), grp;
于 2013-08-26T22:30:54.357 に答える