在MySQL中按顺序,分组和按日期枚举记录

时间:2017-04-13 00:47:39

标签: mysql group-by enumerate

这看起来像是一个简单的问题而且我害怕我可能会遇到重复的问题锤,但这就是我所拥有的:

ID  Date
1   1/11/01
1   3/3/03
1   2/22/02
2   1/11/01
2   2/22/02

我需要做的就是根据日期枚举记录,并按ID分组!就这样:

ID  Date    Num
1   1/11/01 1
1   3/3/03  3
1   2/22/02 2
2   1/11/01 1
2   2/22/02 2

这与this question非常相似,但它对我不起作用。 This会很棒,但不是MySQL。

我尝试使用group by,但它不起作用,如

SELECT ta.*, count(*) as Num
FROM temp_a ta
GROUP BY `ID` ORDER BY `ID`;  

显然没有运行,因为GROUP BY总是会产生一个值。

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:2)

我们假设该表如下:

CREATE TABLE q43381823(id INT, dt DATE);
INSERT INTO q43381823 VALUES
(1, '2001-01-11'),
(1, '2003-03-03'),
(1, '2002-02-22'),
(2, '2001-01-11'),
(2, '2002-02-22');

然后,可以编写获得所需输出的查询的方法之一是:

SELECT q.*,  
    CASE WHEN (
            IF(@id != q.id, @rank := 0, @rank := @rank + 1)
         ) >=1 THEN @rank
         ELSE @rank := 1 
    END as rank,
    @id := q.id AS buffer_id
FROM q43381823 q
CROSS JOIN (
    SELECT  @rank:= 0, 
        @id  := (SELECT q2.id FROM q43381823 AS q2 ORDER BY q2.id LIMIT 1)
    ) x
ORDER BY q.id, q.dt

输出:

  id  |    dt        |   rank  |    buffer_id 
-------------------------------------------------    
  1   |  2001-01-11  |    1    |       1    
  1   |  2002-02-22  |    2    |       1
  1   |  2003-03-03  |    3    |       1
  2   |  2001-01-11  |    1    |       2
  2   |  2002-02-22  |    2    |       2

您可以忽略输出中的buffer_id列 - 它与结果无关,但需要重置rank

SQL Fiddle Demo


说明:

  • @id变量根据输出的排序顺序跟踪行中的每个id。在初始迭代中,我们将其设置为可能在最终结果中获得的第一条记录的id。请参阅子查询SELECT q2.id FROM q43381823 AS q2 ORDER BY q2.id LIMIT 1

  • @rank最初设置为0,默认情况下会为结果集中的每个后续行增加。但是,当id更改时,我们会将其重置为1。请参阅查询中的CASE - WHEN - ELSE构造。

  • 最终输出首先按id排序,然后按dt排序。这可确保@rank为同一dt内的每个后续id字段逐步设置1,但每当新id组开始显示时,都会重置为private DatabaseReference mdatabas; private List<String> keys; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_makequestions); keys=new ArrayList<>(); mdatabas=FirebaseDatabase.getInstance().getReference() .child("QUESTIONS").child("SPANISH"); getNofQuestions(); } private void getNofQuestions(){ mdatabas.child("QUESTIONID").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { //QUESTION ID IS EQUAL TO THE NUMBER OF QUESTIONS nOfQuestions=dataSnapshot.getValue(Integer.class); getRandom(); } @Override public void onCancelled(DatabaseError databaseError) { } }); } private void getRandom(){ getQuestion(random.nextInt(nOfQuestions-11)+11); } private void getQuestion(int random){ mdatabas.child(String.valueOf(random)).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(keys.size()==4){ Toast.makeText(getApplicationContext(),"FINISHED",Toast.LENGTH_SHORT).show(); } else{ if(dataSnapshot.child("STATE").getValue(String.class)!=null){ if(dataSnapshot.child("STATE").getValue(String.class).equals("ACEPTED")){ keys.add(dataSnapshot.getKey()); getRandom(); } else{ getRandom(); } } else{ getRandom(); } } } @Override public void onCancelled(DatabaseError databaseError) { } }); } 在结果集中。