1

日付と金額の2つの列を持つテーブルがあります。量の x 日のピークを見つけられるようにしたい。したがって、次の表があり、たとえば 3 日間のピークを探している場合、その日の金額が前後の 3 日間のどの日よりも多いことを意味し、その日付が選択されます。

date         amount
2012-09-04 | 53137.47
2012-09-05 | 53137.2
2012-09-06 | 53137.54
2012-09-07 | 53138.58
2012-09-10 | 53138.73
2012-09-11 | 53138.28
2012-09-12 | 53138.22
2012-09-13 | 53138.48
2012-09-14 | 53140.14
2012-09-17 | 53139.82
2012-09-18 | 53139.86
2012-09-19 | 53140.01
2012-09-20 | 53139.75
2012-09-21 | 53139.82
2012-09-24 | 53139.01
2012-09-25 | 53138.93
2012-09-26 | 53138.48
2012-09-27 | 53138.83
2012-09-28 | 53138.62

2012-09-10、2012-09-14 を選択する必要があります

結合と派生テーブルを使用してみましたが、機能しないようです。

以下を試しました:

    select * from a WHERE  
amount=(select MAX(amount) from a where 
date<date_add(date,interval 3 day) and 
date>date_sub(date,interval 3 day));

    SELECT a1.*
    FROM a AS a1
    JOIN a AS a2 ON 
(select * from a1 where 
a2.DATE < a1.DATE + 3 and 
a2.DATE > a1.DATE - 3) myalias
    WHERE a1.amount > a2.amount;
4

1 に答える 1

0

日付間隔の最大値を見つけるには、中心日付のレコードを間隔内の他の日付のレコードに結合し、中心日付でグループ化する必要があります。

このクエリを試してください:

SELECT a1.date, a1.amount, max(a2.amount) AS highest
FROM tbl a1 LEFT JOIN tbl a2
ON a2.date BETWEEN date_sub(a1.date, interval 3 DAY)
           AND date_add(a1.date, interval 3 DAY)
GROUP BY a1.date, a1.amount
HAVING a1.amount = highest
ORDER BY a1.date;

暦日ではなく連続したレコードに基づいて回答を得るには、行番号をテーブルに追加し (テーブル自体への自己結合を行うことによって)、次に、この拡張されたテーブルの自己結合をそれ自体に行う必要があります。金額を比較する場合、各日付の +/- 3 行以内の行:

SELECT t3.date FROM
  (SELECT t1.date AS date, t1.amount AS amount, count(t2.date) AS rownum
   FROM tbl t1
   INNER JOIN tbl t2
   ON t2.date <= t1.date
   GROUP BY t1.date, t1.amount) AS t3
LEFT JOIN
  (SELECT t1.date AS date, t1.amount AS amount, count(t2.date) AS rownum
   FROM tbl t1
   INNER JOIN tbl t2
   ON t2.date <= t1.date
   GROUP BY t1.date, t1.amount) AS t4
ON t3.rownum <> t4.rownum
AND t3.rownum - t4.rownum  BETWEEN -3 AND 3
AND t4.amount >= t3.amount
WHERE t4.date IS NULL
ORDER BY t3.date

これは MySQL と PostgreSQL の両方で機能し、他のデータベース エンジンでも機能するはずです。MySQL 以外のデータベースでは、2 つのサブクエリに CTE を使用することで簡素化できます。

このSQLfiddleを使用してテストしてください。

于 2012-11-21T14:57:15.423 に答える