oracle 根据最大分配数按category_type统计公告表记录数

2cmtqfgy  于 2023-01-25  发布在  Oracle
关注(0)|答案(1)|浏览(112)

我有一个POST表、一个CATEGORY表、一个CATEGORY_TYPE表和一个ASSIGNMENT表,我解释了ASSIGNMENT表包含每个类别到category_type的分配,例如ID = 4且category_id = 3的POST在2018 category_type_id = 1中具有最后一次分配,因此查询应获得特定年份的最后一次分配

//POST table
+----+-------------+
| id | category_id |
+----+-------------+
|  1 |      1      |
|  2 |      2      |
|  3 |      1      |
|  4 |      3      |
|  5 |      1      |
|  6 |      1      |
|  7 |      1      |
|  8 |      3      |
|  9 |      2      |
| 10 |      2      |
| 11 |      4      |
+----+-------------+

//CATEGORY table
+----+------------------+
| id |   category_name  |
+----+------------------+
|  1 |    category_1    |
|  2 |    category_2    |
|  3 |    category_3    |
|  4 |    category_4    |
|  5 |    category_5    |
+----+------------------+

//CATEGORY_TYPE table
+----+------------------+
| id |  category_type   |
+----+------------------+
|  1 |     type_1       |
|  2 |     type_2       |
|  3 |     type_3       |
+----+------------------+

//ASSIGNMENT table
+----+------------------+---------------------+--------------+
| id |   category_id    |   category_type_id  | Date         |
+----+------------------+---------------------+--------------+
|  1 |        1         |          3          |  2017-01-01  |
|  2 |        3         |          2          |  2017-11-10  |
|  3 |        1         |          2          |  2017-12-02  |
|  4 |        5         |          3          |  2018-01-01  |
|  5 |        2         |          1          |  2018-04-03  |
|  6 |        3         |          1          |  2018-05-06  |
|  7 |        2         |          2          |  2018-09-21  |
|  8 |        1         |          3          |  2018-11-01  |
|  9 |        4         |          2          |  2018-12-29  |
| 10 |        3         |          3          |  2019-02-16  |
| 11 |        5         |          1          |  2019-06-20  |
| 12 |        1         |          1          |  2019-12-01  |
+----+------------------+---------------------+--------------+

因此,我想计数后的类别_类型取决于最后一次分配的specifique年

select category_type, count(*) as cnt 
from(
select max(ctt.category_type) AS category_type
from post p 
        inner join category ct on (p.category_id = ct.id)
        left outer join (
            select category_id,
            max(category_type_id) keep (dense_rank last order by id) AS category_type_id
            from assignment ag
            where extract (year from ag.date) <= 2018
            group by category_id
            ) ag
        on (ct.id= ag.category_type_id)
        left join category_type ctt on ag.category_type_id = ctt.id      
        group by ctt.id
)
group by category_type;

遵循此处的逻辑是预期要选择的数据

+---------------+----------+
| category_type |    cnt   |
+---------------+----------+
|     type_1    |     2    |
|     type_2    |     4    |
|     type_3    |     5    |
+---------------+----------+

根据数据,cnt的总和= 11个帖子,这是正确的,但问题是查询没有返回正确的结果

+---------------+----------+
| category_type |    cnt   |
+---------------+----------+
|     type_1    |     4    |
|     type_2    |     6    |
|     type_3    |     8    |
+---------------+----------+

最好的问候

ac1kyiln

ac1kyiln1#

我采用了稍微不同的方法。您可以使用Correlated Subquery返回适用的ASSIGN_DATECATEGORY_ID的最新CATEGORY_TYPE_ID。下面您将看到我为CATEGORY_ID选择了2018上/之前的最新ASSIGN_DATE

    • SQL语言**:
SELECT
  d.CATEGORY_TYPE,
  COUNT(a.ID) AS POST_CNT
FROM
  POST a
  LEFT OUTER JOIN CATEGORY b ON a.CATEGORY_ID = b.ID
  LEFT OUTER JOIN (
    SELECT
      a.ID,
      a.CATEGORY_ID,
      a.CATEGORY_TYPE_ID,
      a.ASSIGN_DATE
    FROM
      ASSIGNMENT a
      /* RETURN LATEST CATEGORY_TYPE_ID FOR CATEGORY_ID FOR THE APPLICABLE YEAR VIA CORRELATED SUBQUERY */
    WHERE
      a.ASSIGN_DATE = (
        SELECT
          MAX(ASSIGN_DATE)
        FROM
          ASSIGNMENT
        WHERE
          CATEGORY_ID = a.CATEGORY_ID
          AND EXTRACT(YEAR FROM ASSIGN_DATE) <= 2018)
  ) c ON b.ID = c.CATEGORY_ID
  LEFT OUTER JOIN CATEGORY_TYPE d ON c.CATEGORY_TYPE_ID = d.ID
GROUP BY
  d.CATEGORY_TYPE
ORDER BY
  d.CATEGORY_TYPE
    • 结果**:
| CATEGORY_TYPE | POST_CNT |
|---------------|----------|
|        type_1 |        2 |
|        type_2 |        4 |
|        type_3 |        5 |

相关问题