MySQL:在SELECT查询期间为每个唯一的事件标记1

MySQL:在SELECT查询期间为每个唯一的事件标记1,mysql,sql,Mysql,Sql,示例表tbl_名称: | ID | Name | Month | Quarter | Year | | 1 | A | Jan | 1 | 2019 | | 1 | A | Feb | 1 | 2019 | | 2 | B | May | 2 | 2019 | | 3 | C | May | 2 | 2018 | 您好,这是我使用SELECT查询提取的表。我可以使用SELECT distinct n

示例表tbl_名称:

| ID | Name | Month | Quarter | Year |
| 1  | A    | Jan   |  1      | 2019 |
| 1  | A    | Feb   |  1      | 2019 |
| 2  | B    | May   |  2      | 2019 |
| 3  | C    | May   |  2      | 2018 |
您好,这是我使用SELECT查询提取的表。我可以使用SELECT distinct name,year FROM tbl_name查找每年的不同名称;但我试图在SELECT查询期间添加一列,以标识或统计名称每年的唯一出现次数

预期:

| ID | Name | Month | Quarter | Year | Unique Count |
| 1  | A    | Jan   |  1      | 2019 |      1       |
| 1  | A    | Feb   |  1      | 2019 |      0       |
| 2  | B    | May   |  2      | 2019 |      1       |
| 3  | C    | May   |  2      | 2018 |      1       |

我试着分成两个查询——一个选择所有内容;另一个只选择不同的并将它们连接在一起,但这将引入重复项。有没有一种使用SQL的方法可以做到这一点?

如果您运行的是MySQL 8.0,您可以使用row_number来标记名称在一年中的外观:

请考虑修复日期列的存储策略。与其将信息拆分为几列,不如在相关日期数据类型中有一个唯一的列来存储该信息。这样你就不用在需要时重新编排日期了

:


你可以试试下面的逻辑-

输出为-

ID  Name    Month   Quarter Year    Unique_Count
1   A       Jan     1       2019    1
1   A       Feb     1       2019    0
2   B       May     2       2019    1
3   C       May     2       2018    1

为什么二月的计数小于一月?为什么将月份存储为字符串,而不包含正确指定顺序的列?@GordonLinoff这是源数据,我对此无能为力。我只能在我这边使用它。谢谢+1,我删除了我的评论。如果日期存储在一列中,OP的生活会轻松得多:-太糟糕了,我无法控制表模式。有没有一种不用分区就能做到这一点的方法?我使用的软件似乎不支持分区查询 ID | Name | Month | Quarter | Year | unique_count -: | :--- | :---- | ------: | ---: | -----------: 1 | A | Feb | 1 | 2019 | 1 1 | A | Jan | 1 | 2019 | 0 2 | B | May | 2 | 2019 | 1 3 | C | May | 2 | 2018 | 1
WITH your_table(ID,Name,Month,Quarter,Year)
AS
(
    SELECT 1,'A','Jan',1,2019 UNION ALL
    SELECT 1,'A','Feb',1,2019 UNION ALL
    SELECT 2,'B','May',2,2019 UNION ALL
    SELECT 3,'C','May',2,2018
)
,CTE AS
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Quarter,Year) RN
    FROM your_table
)

SELECT ID,Name,Month,Quarter,Year,
CASE WHEN RN = 1 THEN 1 ELSE 0 END Unique_Count
FROM CTE
ID  Name    Month   Quarter Year    Unique_Count
1   A       Jan     1       2019    1
1   A       Feb     1       2019    0
2   B       May     2       2019    1
3   C       May     2       2018    1