计算每次出现的行号

时间:2018-09-29 19:48:29

标签: mysql

我正在尝试为列中的特定值编号。您可以看到我已经根据日期对表进行了排序,对于查询来说,根据已经排序的日期进行编号(从基于日期的最小值到最高值)是很重要的。

我试图为潜在客户成为客户所需的访问次数分配一个数字。

Ad Group|Vist Date |Phone Number
--------+----------+------------
A.      |09/01/2018|555-444-3321
A.      |09/02/2018|777-454-3333
A.      |09/03/2018|555-444-3321
A.      |09/04/2018|777-454-3333
A.      |09/05/2018|555-444-3321
A.      |09/06/2018|777-454-3333
A.      |09/07/2018|555-444-3321
A.      |09/08/2017|777-454-3333

Desired Output


Ad Group|Visit Date|Phone Number|Number of Occurrences within date
--------+----------+------------+---------------------------------
A.      |09/01/2018|555-444-3321|1
A.      |09/02/2018|777-454-3333|1
A.      |09/03/2018|555-444-3321|2 
A.      |09/04/2018|777-454-3333|2
A.      |09/05/2018|555-444-3321|3
A.      |09/05/2017|888-465-9999|1
A.      |09/06/2018|777-454-3333|3
A.      |09/07/2018|555-444-3321|4
A.      |09/08/2017|777-454-3333|4
A.      |09/08/2017|999-432-1111|1
A.      |09/09/2017|888-465-9999|2

4 个答案:

答案 0 :(得分:1)

应创建所需输出的查询:

'currencies.*' => 'size:3|alpha_num'

答案 1 :(得分:1)

以下解决方案应适用于所有MySQL版本(尤其是<8.0)

尝试以下查询(请相应地更改表和列名称):

SET @num_occurence = 0;
SET @phone_no = '';

SELECT derived_t.ad_group, 
       derived_t.visit_date, 
       derived_t.phone_number, 
       derived_t.number_of_occurences 
FROM 
(
  SELECT t1.ad_group, 
         t1.visit_date, 
         @num_occurence := CASE
                             WHEN @phone_no = t1.phone_number
                               THEN @num_occurence + 1
                             ELSE 1
                           END AS number_of_occurences, 
         @phone_no := t1.phone_number AS phone_number 
  FROM your_table AS t1 
  ORDER BY t1.phone_number ASC, t1.visit_date ASC 
) AS derived_t 
ORDER BY derived_t.visit_date ASC 

答案 2 :(得分:1)

如果您使用的是8.0+,则...窗口功能可用,这很简单。

SELECT `Ad Group`
     , `Visit Date`
     , `Phone Number`
     , ROW_NUMBER() over (PARTITION BY `Ad Group`, `Phone Number` ORDER BY Visit Date Asc) as `Number of Occurrences within date`
FROM TableName
ORDER BY `Visit Date` asc 

window函数仅将ag groupphone numbers视为“唯一键”,并按访问日期asc排序此键,然后为遇到的唯一键的每一行分配数字1-x(每个日期1个)。如果给定的组和编号重复了日期,则我们没有定义特定的顺序,并且将为该唯一键分配下两个编号。如果我们使用Dense_Rank()窗口函数,则会为每行分配相同的编号。

窗口功能允许排序和编号与命令的顺序和选择相互依赖。这样一来,我们就可以为按访问日期排序的每个“分区”数据(广告组和电话号码)分配行。因此,允许#从每个分区的1开始,并为遇到的每个日期行加1;按照访问日期的升序。

如果不是8.0+,则忽略此帖子; P

某些窗口功能包括:

  • Row_Number()
  • Rank()
  • Dense_Rank()
  • Sum()
  • Count()
  • Lead()
  • Lag()

文档:https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html

答案 3 :(得分:0)

假设我已正确理解您的问题,以下查询应会有所帮助:

SELECT `Ad Group`, `Visit Date`, `Phone Number`, count(*) `Number of Occurrences within date`
FROM <table name>
ORDER BY `Visit Date` (ASC|DESC)
GROUP BY `Phone Number`

理论上,以上查询应始终返回每个组的第一行。