2

テーブルグリッドには、次のようなスキーマID、x1、x2、y1、y2を持つ座標がたくさんあります。

22,910000,920000,120000,130000
67,930000,940000,170000,180000
171,980000,990000,210000,220000

グリッドテーブルには、各座標タプルの ID もあります。

別のテーブルcrashesには、自動車の衝突に関する情報があり、最後の 2 つの値はそれぞれ「x_coordinate」と「y_coordinate」です。

2007,2,9,4,1,1028977,202232
2004,1,1,1,4,1012600,214101
2003,1,9,1,1,958775,156149
1999,1,1,1,1,997349,175503

1-各正方形グリッドのクラッシュ数を計算するにはどうすればよいですか? (2 つの列を表示: グリッド ID とそれに関連するクラッシュの数)

2-逆に、2005 年、2006 年、2007 年に 60 回を超えるクラッシュが発生したすべての「正方形グリッド」(x1、x2、y1、y2 のタプル) を取得するにはどうすればよいでしょうか? (HTML では、2005 年 | 2006 年 | 2007 年以下の 3 つの列を持つテーブルのようになります。自動車事故が 60 件以上の基準を満たすタプル x1、x2、y1、y2 を調整します。

4

3 に答える 3

4

#1は簡単です:(これはもともと「どの自動車事故がグリッドテーブルからx1、x2、y1、y2座標の正方形グリッドに分類されるかを計算するにはどうすればよいですか?」でした)

SELECT  DISTINCT
            grid.ID
FROM        crashes
INNER JOIN  grid    
            ON  crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
            And crashes.y_coordinate BETWEEN grid.y1 AND grid.y2

#2は少し難しいです:(これはもともと「次の年に60回以上のクラッシュがあるすべての「正方形グリッド」(x1、x2、y1、y2のタプル)を取得するにはどうすればよいですか...?」)

SELECT  
            grid.ID, COUNT(*) AS CrashCount
FROM        crashes
INNER JOIN  grid    
            ON  crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
            And crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
WHERE       crashes.yearCol IN(2005, 2006, 2007)
GROUP BY    grid.ID
HAVING      COUNT(*) >= 60

改訂された質問の解決策 ...

#1「各正方形グリッドのクラッシュ数を計算するにはどうすればよいですか?」は、元の#2を単純化したものです。

SELECT  
            grid.ID, COUNT(*) AS CrashCount
FROM        crashes
INNER JOIN  grid    
            ON  crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
            And crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
WHERE       crashes.yearCol IN(2005, 2006, 2007)
GROUP BY    grid.ID

#2については、「 2005年、2006年、および2007年の(それぞれ)に60回を超えるクラッシュが発生したすべての「正方形グリッド」(x1、x2、y1、y2のタプル)を取得するにはどうすればよいですか??

SELECT *
FROM
(
    SELECT  grid.ID,
            grid.x1, grid.x2, grid.y1, grid.y2,
            (   SELECT  COUNT(*)
                FROM    crashes
                WHERE   yearCol = 2005
                  And   crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
                  And   crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
            )   As year05,
            (   SELECT  COUNT(*)
                FROM    crashes
                WHERE   yearCol = 2006
                  And   crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
                  And   crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
            )   As year06,
            (   SELECT  COUNT(*)
                FROM    crashes
                WHERE   yearCol = 2007
                  And   crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
                  And   crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
            )   As year07,
    FROM    grid
) As gridSum
WHERE   year05  >= 60
  And   year06  >= 60
  And   year07  >= 60

これは、WITH 句を使用する TSQL で行う方が少し簡単です...

于 2012-04-05T03:55:50.363 に答える
2

これにより、クラッシュテーブルでクラッシュが発生したGridIdがわかります。> =と<=の代わりに、以下で説明するBETWEENショートカットを意味していると思います

SELECT
     crashes.*
    ,(
        SELECT grid.id
        FROM grid
        WHERE
                crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
            AND crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
     ) AS GridId
FROM crashes

年の間のグリッドでのクラッシュの2番目の質問についてはこれを試してください

SELECT GridId, SUM(CrashesInGrid) AS TotalCrashesInGrid
FROM
(   
    SELECT T.GridId, T.year, COUNT(*) AS CrashesInGrid
    FROM
    (
        SELECT
             *
            ,(
                SELECT grid.id
                FROM grid
                WHERE
                        crashes.x_coordinate BETWEEN grid.x1 AND grid.x2
                    AND crashes.y_coordinate BETWEEN grid.y1 AND grid.y2
             ) AS GridId
        FROM crashes
    ) AS T
) AS T2
WHERE T2.year >= 2005 AND T2.year <= 2007
GROUP BY T2.Year
HAVING SUM(CrashesInGrid) >= 60
于 2012-04-05T04:04:19.923 に答える
1

私は最初の質問をバリーよりよく解決することはできません:)

しかし、これは2番目のものを解決しますか?そうでない場合はお知らせください。

SELECT id FROM (
  SELECT g.id, c.yearCol, COUNT(*) CrashCount FROM crashes c
  INNER JOIN grid g
  ON c.x_coordinate BETWEEN g.x1 and g.x2 AND c.y_coordinate BETWEEN g.y1 AND g.y2
  WHERE c.yearCol IN (2005, 2006, 2007)
  GROUP BY g.id, c.yearCol
  HAVING COUNT(*) >= 60
) final
GROUP BY id
HAVING COUNT(yearCol) = 3
于 2012-04-05T04:39:25.603 に答える