我想通过比较特定列找到最小值,但显示所有列和行。我希望这个例子能让它更加清晰。
这是我的数据:
switchButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case ACTION_DOWN:
if (!switchButton.isChecked()) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
ActivityLogin.this);
alertDialogBuilder
.setMessage(
"Sure you want to enable?. ")
.setCancelable(true)
.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
switchButton.performClick();
}
})
.setNegativeButton(
"NO",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
return true;
} else{
// show dialog Sure you want to disable? and handle the button events accordingly
}
}
return false;
}
});
现在,我通过比较每一行的A和B列(重复)来寻找PK(Min_PK)的最小值。结果应如下所示:
import {Component, NgModule } from '@angular/core';
@Component({
selector: 'test-app',
template: `
<label for="options">Options :</label>
<div *ngFor="let cbItem of cbArr">
<label>
<input type="checkbox"
name="options"
value="{{cbItem}}"
[checked]="cbChecked.indexOf(cbItem) >= 0"
(change)="updateCheckedOptions(cbItem, $event)"/>
{{cbItem}}
</label>
</div>
<button (click)="updateOptions()">Post</button>
`
})
export class TestComponent{
cbArr: string[];
cbChecked: string[];
constructor() {
this.cbArr = ['OptionA', 'OptionB', 'OptionC'];
this.cbChecked = ['OptionB'];
}
updateCheckedOptions(chBox, event) {
var cbIdx = this.cbChecked.indexOf(chBox);
if(event.target.checked) {
if(cbIdx < 0 )
this.cbChecked.push(chBox);
} else {
if(cbIdx >= 0 )
this.cbChecked.splice(cbIdx,1);
}
}
updateOptions() {
console.log(this.cbChecked);
}
}
我尝试了几件事:
+----+----+-----+-----+
| PK | FK | A | B |
+----+----+-----+-----+
| 1 | 1 | abc | tzu |
| 2 | 1 | def | qwe |
| 3 | 2 | abc | tzu |
| 4 | 2 | def | qwe |
| 5 | 3 | def | qwe |
+----+----+-----+-----+
这只返回重复项,但不是所有列和行。如果我将PK和FK添加到GROUP BY,它将比较重复项的所有列。
这越来越近了:
+--------+----+----+-----+-----+
| Min_PK | PK | FK | A | B |
+--------+----+----+-----+-----+
| 1 | 1 | 1 | abc | tzu |
| 2 | 2 | 1 | def | qwe |
| 1 | 3 | 2 | abc | tzu |
| 2 | 4 | 2 | def | qwe |
| 2 | 5 | 3 | def | qwe |
+--------+----+----+-----+-----+
这里我有我想要的所有信息,但它不是正确的形式。我希望它按行分隔。 你能帮我解决这个问题吗?
--------------------------------------- 编辑:
Giorgos Betsos的代码正在研究这个问题,但对于大表来说,它的性能很差。这就是我想添加更多信息的原因。
在我的情况下,我想将代码用于包含 20列和 500k行的大型表格。
如果我使用:
SELECT MIN(PK) AS Min_PK, `table`.`A`, `table`.`B`
FROM `test`.`table`
GROUP BY `table`.`A`, `table`.`B`;
+--------+-----+-----+
| Min_PK | A | B |
+--------+-----+-----+
| 1 | abc | tzu |
| 2 | def | qwe |
+--------+-----+-----+
超级快。获取所有信息只需几秒钟。但不幸的是,形式错误。
如果我使用Giorgos Betsos的代码:
SELECT
MIN(PK) AS Min_PK,
GROUP_CONCAT(`table`.`PK`),
GROUP_CONCAT(`table`.`FK`),
`table`.`A`,
`table`.`B`
FROM `test`.`table`
GROUP BY
`table`.`A`,
`table`.`B`;
+--------+----------------------------+----------------------------+-----+-----+
| Min_PK | GROUP_CONCAT(`table`.`PK`) | GROUP_CONCAT(`table`.`FK`) | A | B |
+--------+----------------------------+----------------------------+-----+-----+
| 1 | 1,3 | 1,2 | abc | tzu |
| 2 | 2,4,5 | 1,2,3 | def | qwe |
+--------+----------------------------+----------------------------+-----+-----+
这是正确的形式和结果,但由于子查询+ 20 JOINS需要花费很多时间....
另一个问题是某些列中有NULL值,因此JOIN不起作用....
有什么想法吗?
答案 0 :(得分:1)
您可以将第一个查询用作派生表并连接回原始表,以便获取其余字段:
Range("H16").Value = "Select distinct(description), merchant_name from(" & vbCrLf & "select distinct description, merchant_name from table_phase" & Range("G3").Value
Range("H16").Value = Range("H16").Value & vbCrLf & patternString & vbCrLf & "Union all" & vbCrLf
Range("H16").Value = Range("H16").Value & "select distinct description, merchant_name from table_phase" & Range("G4").Value
Range("H16").Value = Range("H16").Value & vbCrLf & patternString & vbCrLf & ") order by merchant_name, description"
Range("H16").Value = Trim(Range("H16").Value)
Range("H16").WrapText = True
Range("J16").Value = Replace(Range("H16").Value, vbCrLf, " ")
Range("J16").Copy