6

ユーザーアクティビティの表があります。ユーザー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 になるはずです。それ以上の助けは素晴らしいでしょう。

4

2 に答える 2

5

GROUP BY月ごとに四半期を分離し、年を処理するためにで派生した列を作成できますCASE。月 <= 7 月の場合、年から 1 を引いて、8 月に始まる年を作成します (グループ化の目的のためだけに)。私はこれが仕事をするべきだと思います:

SELECT 
  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
    /* Make a year that starts with August so quarters appear to be all in the same year */
    WHEN MONTH(a.Date) <= 7 THEN YEAR(a.Date) - 1 
    ELSE YEAR(a.Date) 
  END AS quarteryear,
  COUNT(*) AS num_activites
FROM Activity a
WHERE
  a.InstitutionNumber = '000000000075'  
  AND a.HWA = '001372EADBC4'
  AND (a.Date between '2011-08-01' and '2012-07-31')
/* Groupings over the quarter and fake year for aggregates */
GROUP BY
  quarter, 
  quarteryear

アップデート:

あなたの質問を読み直してください。これはあなたが望む正確な出力ではないことに気付きました。上記は四半期ごとのイベントの数を示しますが、実際にはイベントのある四半期の数が必要でした。それを取得するには、上記の部分をサブクエリでラップして、それを取得できますCOUNT()

SELECT quarteryear, COUNT(*)
FROM (
    SELECT 
      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
        /* Make a year that starts with August so quarters appear to be all in the same year */
        WHEN MONTH(a.Date) <= 7 THEN YEAR(a.Date) - 1 
        ELSE YEAR(a.Date) 
      END AS quarteryear,
      COUNT(*) AS num_activites
    FROM Activity a
    WHERE
      a.InstitutionNumber = '000000000075'  
      AND a.HWA = '001372EADBC4'
      AND (a.Date between '2011-08-01' and '2012-07-31')
    /* Groupings over the quarter and fake year for aggregates */
    GROUP BY
      quarter, 
      quarteryear
) qtrsubcounts
GROUP BY quarteryear
于 2012-08-01T23:43:15.280 に答える