1

私はこのクエリを書きました、それは私が望むほとんどのことをします:

SELECT * FROM 
(
   SELECT COUNT(*) as cnt,
   lat,
   lon,
   elev, 
   GROUP_CONCAT(CONCAT(usaf,'-',wban))
   FROM `ISH-HISTORY_HASPOS` 
   GROUP BY  lat,lon,elev 
 ) AS x WHERE cnt >=1;

出力:

+-----+--------+----------+--------+-------------------------------------------------+
| cnt | lat    | lon      | elev   | GROUP_CONCAT(CONCAT(usaf,'-',wban))                              |
+-----+--------+----------+--------+-------------------------------------------------+
|   4 | 30.478 |  -87.187 | 36     | 722220-13899,722221-13899,722223-13899,999999-13899              |
|   4 | 36.134 |  -80.222 | 295.7  | 723190-93807,723191-93807,723193-93807,999999-93807              |
|   5 | 37.087 |  -84.077 | 369.1  | 723290-03849,723291-03849,723293-03849,724243-03849,999999-03849 |
|   5 | 38.417 | -113.017 | 1534.1 | 745200-23176,745201-23176,999999-23176,724757-23176,724797-23176 |
|   4 | 40.217 |  -76.851 | 105.8  | 999999-14751,725110-14751,725111-14751,725118-14751              |
+-----+--------+----------+--------+-------------------------------------------------+

これは、同じ座標にあるステーションの連結リストを返します。ただし、隣接する日付範囲を持つステーションを連結することにのみ関心があります。(ISH-HISTORY_HASPOS) から選択したテーブルには、「開始」と「終了」の 2 つの日時列があります。GROUP_CONCAT 条件を満たすには、これら 2 つの列の値が互いに 3 日以内である必要があります。

編集:最終結果の GROUP_CONCAT にステーションを含めるには、次の条件を満たす必要があります。

  1. リスト内の別のステーションと同じ場所に配置する必要があります (緯度、経度、高度でグループ化)

  2. そのend時間は、別のステーションの時間から 3 日以内である必要があります。beginまたは、別のステーションの時間beginから 3 日以内である必要があります end。「別の駅」と言うときは、同じ場所にある (#1 の条件を満たしている) 駅を指しています。

サブクエリを使用する必要があると思いますが、その方法がわかりません。いくつかの助けをいただければ幸いです。クエリまたはストアド プロシージャのいずれかが優れていますが、php ソリューションも受け入れられます。

これは、クエリを実行しているテーブルのダンプです: sql dump

結果は私の例と同じに見えるはずですが、隣接していないアイテム (日付単位) は存在しないはずです。

4

2 に答える 2

1

解決策として、サブクエリを使用して 3 日以内にステーションのリストを計算し、このサブクエリを where 句としてメイン クエリに追加することが考えられます。サブクエリは、結果の行列の前半のみを取得する最初の条件と、時間の制約を指定する 2 つの条件を使用して、考えられるすべてのステーション カップルを一覧表示するデカルト積で構成されます。beginこれらの後者の条件については、私が推測しただけで、フィールドとendフィールドの測定単位がよくわかりません。結果のクエリは次のようになります。

SELECT * FROM (
    SELECT COUNT(*) AS
       cnt,
       lat,
       lon,
       elev,
    GROUP_CONCAT(CONCAT(usaf, '-', wban))  
    FROM ISH-HISTORY_HASPOS  
    WHERE id IN (
        SELECT DISTINCT t1.id  
        FROM ISH-HISTORY_HASPOS t1  
        INNER JOIN ISH-HISTORY_HASPOS t2
           ON t1.lon = t2.lon
           AND t1.lat = t2.lat
           AND t1.elev = t2.elev  
        WHERE t1.id < t2.id
            AND abs(t1.begin - t2.end) < 259200
            AND abs(t1.end - t2.begin) < 259200  
        UNION  
        SELECT DISTINCT t2.id  
        FROM ISH-HISTORY_HASPOS t1  
        INNER JOIN ISH-HISTORY_HASPOS t2
            ON t1.lon = t2.lon
            AND t1.lat = t2.lat
            AND t1.elev = t2.elev  
        WHERE t1.id < t2.id
            AND abs(t1.begin - t2.end) < 259200
            AND abs(t1.end - t2.begin) < 259200
    )
    GROUP BY lat, lon, elev   
) AS x WHERE cnt >= 1;
于 2012-12-03T08:02:02.590 に答える