MySQL:在SELECT查询期间为每个唯一的事件标记1
示例表tbl_名称: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
| 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