这看起来像是一个简单的问题而且我害怕我可能会遇到重复的问题锤,但这就是我所拥有的:
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
总是会产生一个值。
任何建议都非常感谢。
答案 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
。 的
说明:
@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) {
}
});
}
在结果集中。