私は次の方法でデータを持っています
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 句で解決策があれば、遅延の場所で時間を管理できます。
ありがとうリシャブ
私の最初の答えは、常にうまくいくとは限りませんでした。次のようになります。
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 用に変換できます。
使用するデータベース サーバー (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);
}
-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
句を追加することもできます。