0

response_archive 27 000 000 行の 2 つのテーブルと、4 000 行からなる空港があります。

選択しようとしているフィールド:

  • response_archive.min(価格)
  • response_archive.avg(価格)
  • response_archive.year_week <- (グループ化、索引付け)
  • response_archive.from (airport.IATA と結合)
  • response_archive.to (airport.IATAに参加)

  • response_archive.from と response_archive.to を同じにすることはできません。

  • クエリに示されているように、response_archive.year_week はスパン内にある必要があります。

グループ化に問題があります。response_archive.year_week でグループ化できず、同時に最小/平均価格を取得できません。

これは私の現在のクエリです。最適とはほど遠いもので、実行に約 90 秒かかります。

SELECT
    `from`,
    `to`,
    year_week,
    min(price) min_price,
    round(AVG(price)) avg_price
  FROM response_archive
   INNER JOIN airports AS `f` ON (f.IATA = `from`)
   INNER JOIN airports AS `t` ON (t.IATA = `to`)
 WHERE
    year_week < '1310' AND
    year_week > '1210' AND
    returntrip = 1 AND
    adults = 1 AND
    children = 0 AND
    `price` < 70000 AND
    `price` > 80 AND
    f.SweCity = 'Stockholm' AND
    t.CountryCode = 'US'
GROUP BY year_week
ORDER BY year_week;

現在の結果:

from   to     year_week min   avg
STO    NYC    1211      3552  6311
ARN    LAX    1212      3097  6496
STO    NYC    1213      3532  7379
ARN    NYC    1214      3584  6635
STO    LAX    1215      3523  5907
STO    FLL    1216      3559  5698
STO    NYC    1217      3642  5919

最小/平均が正しくないことを除いて。

最初の値が正しいかどうかの比較:

SELECT
    min(price) min,
    '3532' min_expected,
    round(avg(price)) avg,
    '7379' avg_expected
FROM
    response_archive
WHERE
    `from` = 'STO' AND
    `to` = 'NYC' AND
    year_week = '1213' AND
    returntrip = 1 AND
    adults = 1 AND
    children = 0 AND
    `price` < 70000 AND
    `price` > 80;

正しい結果:

min     min_exp avg     avg_exp
3532    3532    5955    7379

誰かが私を方向に向けたり、私が望む結果が得られない理由を説明したりできますか.

4

2 に答える 2

0

GROUP BY以下は、不足しているフィールドが追加された単純化されたクエリです。

SELECT
    `from`,
    `to`,
    year_week,
    min(price) min_price,
    round(AVG(price)) avg_price
  FROM response_archive
   INNER JOIN airports AS `f` ON (f.IATA = `from`)
   INNER JOIN airports AS `t` ON (t.IATA = `to`)
 WHERE
    year_week < '1310' AND
    year_week > '1210' AND
    returntrip = 1 AND
    adults = 1 AND
    children = 0 AND
    `price` < 70000 AND
    `price` > 80 AND
    f.CountryCode = 'SE' AND
    t.CountryCode = 'US'
GROUP BY `from`, `to`, year_week
ORDER BY year_week;
于 2013-09-19T08:35:43.873 に答える
0

テーブル x を避けて、条件を外部の where に入れることができます。これを試して:

SELECT 
    `from`,
    `to`,
    year_week,
    min(price) min_price,
    round(AVG(price)) avg_price     
FROM
    response_archive AS r
        INNER JOIN airports AS `f` ON (f.IATA = `from`)
        INNER JOIN airports AS `t` ON (t.IATA = `to`),
WHERE
    r.year_week < '1310' AND
    r.year_week > '1210'        
    returntrip = 1 AND
    adults = 1 AND
    children = 0 AND
    `price` < 70000 AND
    `price` > 80 AND
    f.CountryCode = 'SE' AND
    t.CountryCode = 'US'
group by `from`,`to`, year_week
于 2013-09-19T08:36:36.483 に答える