ユーザーアクティビティの表があります。ユーザーIDと日付を持っています。日付範囲に基づいてユーザーがアクティビティを行った四半期を取得する必要があります。
日付範囲: 2011-08-01 - 2012-07-31
Q1 - Aug-Oct
Q2 - Nov-Jan
Q3 - Feb-Apr
Q4 - May-Jul
私はmysql でQUARTER関数をいじってみましたが、それは年の初めとして 1 月に基づいた四半期のみを返します。
SELECT QUARTER(a.Date), a.Date
FROM activity AS a
WHERE a.InstitutionNumber = '000000000075'
AND a.HWA = '001372EADBC4'
AND (a.Date between '2011-08-01' and '2012-07-31')
GROUP BY QUARTER(a.Date), a.HWA
戻り値:
QUARTER Date
1 2012-01-11
3 2011-08-01
4 2011-10-03
各 HWA が活動している四半期を、重複することなくカウントとしてリストできるようにしたいと考えています。つまり、HWA が 2011 年 8 月から 1012 年 7 月の日付に基づいて四半期 1、2、および 3 で使用されている場合、その HWA の四半期を 3 としてリストしたいということです。
アップデート:
以下の回答から、私が述べた質問に回答しました。私は今、さらに複雑な問題を抱えています。一部の HWA は、他の HWA の代替品です。このような場合、それらはリンクされていることを示すために同じ groupID を持っています。このような場合、重複する四半期をキャンセルする必要があります。明確にするために、2 つの HWA が第 2 四半期に使用され、それらが同じグループ ID を持っている場合、そのうちの 1 つの第 2 四半期のみをカウントする必要があります (これは問題ではありません)。以下は、私が取得した出力で現在使用しているクエリです。
SELECT act.HWA, count(act.HWA), m.Status, m.GroupID
FROM (
SELECT
a.HWA, a.Date,
CASE
WHEN MONTH(a.Date) BETWEEN 8 AND 10 THEN 'Q1'
WHEN (MONTH(a.Date) BETWEEN 11 AND 12 OR MONTH(a.Date) = 1) THEN 'Q2'
WHEN MONTH(a.Date) BETWEEN 2 AND 4 THEN 'Q3'
WHEN MONTH(a.Date) BETWEEN 5 AND 7 THEN 'Q4'
END AS quarter,
CASE
WHEN MONTH(a.Date) <= 7 THEN YEAR(a.Date) - 1
ELSE EXTRACT(YEAR_MONTH from a.Date)
END AS quarteryear,
COUNT(*) AS num_activites
FROM activity a
WHERE
a.InstitutionNumber = '000000000075'
AND (a.HWA = '001372EADBC4' OR a.HWA = '180373E241DB' OR a.HWA = '180373E23DE7')
AND (a.Date between '2011-08-01' and '2012-07-31')
GROUP BY
quarter,
a.HWA
) act, machine m
where act.HWA = m.HWA
group by act.HWA
これはこれを返します:
HWA quarters status groupid
001372EADBC4 3 deleted 59970
180373E23DE7 2 online 59970
180373E241DB 1 deleted 59970
3 つの HWA はすべて、四半期 3 と同じグループ ID を共有します。カウントに Q3 が含まれている必要があるのは、そのうちの 1 つだけです。上記から、3 つの HWA の間に合計 6 つの四半期があることがわかります。そのうちの 2 つの四半期から 3 分の 1 を削除すると、3 つの HWA すべてで合計 4 分の 1 になるはずです。それ以上の助けは素晴らしいでしょう。