1

私は次の方法でデータを持っています

Prog_Id Low_latency Max_Latency
1 4
-1 5
3 8
11 12
12 15

今、出力を次のように表示したい

Prog_Id Low_latency Max_Latency
-1 8
11 15

基本的に、重複するデータをマージしたいと考えています。誰でもコードを手伝ってもらえますか。OVERLAPS 句で解決策があれば、遅延の場所で時間を管理できます。

ありがとうリシャブ

4

3 に答える 3

1

私の最初の答えは、常にうまくいくとは限りませんでした。次のようになります。

select distinct *
from (
   select
     t1.Prog_ID,
     min(least(l, Low_latency)),
     max(greatest(g, Max_Latency))
   from yourtable t1 inner join (select
                                   t1.Prog_ID,
                                   least(t1.Low_latency, t2.Low_latency) l,
                                   greatest(t1.Max_Latency, t2.Max_Latency) g
                                 from
                                   yourtable t1 inner join yourtable t2
                                   on t1.Prog_ID=t2.Prog_ID
                                      and t1.Low_latency<=t2.Max_Latency
                                      and t1.Max_Latency>=t2.Low_Latency) t2
     on t1.Prog_ID=t2.Prog_ID
        and t1.Low_latency<=t2.g
        and t1.Max_Latency>=t2.l
   group by t1.Low_latency, t1.Max_latency) s

こちらをご覧ください。これは MySql コードですが、他の DBMS 用に変換できます。

于 2012-12-31T11:45:22.633 に答える
0

使用するデータベース サーバー (DBMS) によって異なります。しかし、簡単な解決策はありません。ストアド プロシージャを使用する可能性があります。しかし、私はこれをプログラミング言語で行うことを好みます (どの言語を使用していますか?)

他の人のクエリでいくつかテストした後、SQL で方法が見つかりませんでした。

これは、Javaでreduceをマップするのに似たものです

public class YourData {
    Double Low_latency;
    Dobule Max_Latency;
    int Prog_Id;

    // add getter and setter here

    public boolean tesetOverlapping(YourData data) {
        if ((this.Low_latency<=data.Low_latency && data.Low_latency<=t1.Max_Latency) ¦¦ (this.Low_latency<=data.Max_Latency && data.Max_Latency<=this.Max_Latency)) {
                this.Low_latency = Math.min(this.Low_latency, data.Low_latency);
                this.Max_Latency = Math.min(this.Max_Latency, data.Max_Latency);

                return true
        }

        return false;
    }
}

String sql = "
  SELECT
    t1.Prog_Id,
    t1.Low_latency,
    t1.Max_Latency
  FROM yourtable t1"

ArrayList<ArrayList<Double>> values = new ArrayList<ArrayList<Double>>();

while (row = get sql rows) {

    int progIndex = values.indexOf(row.Prog_Id);

    if (progIndex == -1) {
        progIndex = values.indexOf(row.Prog_Id);

        values.add(progIndex, new ArrayList<Double>());
    }

    values[progIndex].add(new YourData(row));
}  

boolean foundOverlapping = false;
for (int progIndex = 0; progIndex < values.size(); progIndex++) {
    // Do map reduce for each progIndex
    do {
        foundOverlapping = false;
        for (int i = 0; i < values[progIndex].size(); i++) {
            if (!values[progIndex].contains(i)) {
                continue;
            }

            YourData cur = values[progIndex][i];

            for (int x = 0; x < values[progIndex].size(); x++) {
                if (i != x && values[progIndex].contains(x)) {
                    if (cur.tesetOverlapping(values[progIndex][x])) {
                        foundOverlapping = true;
                        values[progIndex].remove(x);
                    }
                }
            }
        }

    } while (foundOverlapping == true);
}
于 2012-12-31T11:41:02.283 に答える
-1

-infinity...9レイテンシーを下げるために, 10...19,パターンでグループ化したいとすると20...29、次のようなものが必要になります。

SELECT
  Prog_Id,
  MIN(Low_latency) AS Low_latency,
  MAX(Max_Latency) AS Max_Latency
FROM
  your_table_name
GROUP BY
  Prog_Id,
  IF(FLOOR(Low_latency/10)<0,0,FLOOR(Low_latency/10))

明らかに、最後の行は使用する RDBMS によって異なりますが、ほとんどの場合は非常に似ているはずです。

ORDER BY句を追加することもできます。

于 2012-12-31T11:35:27.123 に答える