1

異なるIDを持つ種類の複数の行で構成されるテーブルがあります。(種類は多数あります。IDは一意です。両方の列にインデックスが付けられます。)次に、各種類のIDが最も高い2つを選択する必要があります。これが私がすることです。

select max(c.id), max(d.id) from theTable c left join
theTable d on c.id > d.id and c.kind=d.kind
where c.id > constant group by c.kind;

ただし、上記のクエリはあまりうまく機能せず、大きな驚きではありません。私はそれのより速いバージョンを考え出しました...

select c.id, max(d.id) from (select max(id) id, kind from theTable    
where id > constatnt group by kind) c left join
theTable d on c.id > d.id and c.kind=d.kind group by c.kind;

....しかし、それでも十分な速さではありません

同じ結果を達成するためのより効率的な方法はありますか?ありがとう!

編集: Tbaleは履歴テーブルなので、私のタスクは、各種類の現在の値と以前の値を取得し、それらを式(論理演算、合体、ifなど)の一部として比較し、式の結果が異なるかどうかを判断することです

結果セットの例を次に示します。

+ ----------- + ----------- +
| max(c.id)| max(d.id)|
+ ----------- + ----------- +
| 1747 | NULL |
| 1701 | 1432 |
| 1703 | 1434 |
| 1706 | 1437 |
| 1707 | 1438 |
| 1751 | NULL |
| 1713 | 1444 |
| 1750 | NULL |
| 1709 | 1440 |
| 1742 | 1741 |
| 1711 | 1442 |
| 1746 | 1745 |
| 1708 | 1439 |
| 1719 | 1450 |
| 1725 | 1456 |
| 1723年| 1454 |
| 1740 | 1733年|
| 1705 | 1436 |
| 1702 | 1433 |
| 1749 | 1748 |
| 1712 | 1443 |
| 1718 | 1449 |
| 1722 | 1453 |
| 1728 | 1459 |
| 1721 | 1452 |
| 1739 | 1731 |
| 1714 | 1445 |
| 1717 | 1448 |
| 1716 | 1447 |
| 1724 | 1455 |
| 1710 | 1441 |
| 1727 | 1458 |
| 1720 | 1451 |
| 1738 | NULL |
| 1715 | 1446 |
| 1704 | 1435 |
| 1726 | 1457 |
| 1758 | 1757 |
+ ----------- + ----------- +
4

2 に答える 2

2

種類ごとに1行の(kind、id、id)タプルを生成する代わりに、結果セットが種類ごとに2行の(kind、id)であった場合はどうなりますか?ただし、自分で実行しなくても、これがパフォーマンスを向上させるかどうかはわかりません。

x.kind、x.idを選択します
FROM(SELECT a.kind、a.id
        テーブルから
        左外側の結合テーブルb
          ON a.kind = b.kind
         AND a.id <b.id
       GROUP BY a.id
       HAVING COUNT(*)<2
       注文者b.id)x
WHEREx.id>定数
x.kindによる注文;

最後のORDER BY句は、結果を確認しやすくするためのものなので、パフォーマンスを評価するときは省略してください。一部の種類では、定数を超えるIDが1つしかない場合があるため、その種類の(kind、id)行は1つだけであることに注意してください。

于 2013-03-23T22:43:24.800 に答える
1

以下はかなりうまくいくかもしれません:

select kind, max(id) as maxid,
       (select id from t t2 where t2.kind = t.kind and t2.id < max(t1.id) order by id desc limit 1) as secondId
from t
group by kind

にインデックスがある場合、これはうまく機能しkind, idます。

于 2013-03-23T22:55:55.107 に答える