0

現時点では、クエリで最高値を表示するために使用しています:

ORDER BY Height DESC
) T
WHERE RowNum = 1

これは、たとえば 10 などの最大値を表示しますが、2 つのエントリが両方とも同じ値 10 である場合はどうなるでしょうか。

ジョイントの最高値の両方を表示するようにするにはどうすればよいですか?

4

4 に答える 4

2

Oracleで使用、ランク分析を使用

select a, b
  from (select a, b, rank() over (order by height desc) rnk
          from your_table)
 where rnk = 1;
于 2012-12-13T13:23:47.990 に答える
1

1つの解決策は、CTEを使用することです

CTE の使用

;WITH q AS (
  SELECT MAX(Height) AS maxHeight
  FROM   YourTable
)
SELECT *
FROM   YourTable
       INNER JOIN q ON q.maxHeight = Yourtable.Height

またはサブセレクトを含む単純な where 句

SELECT *
FROM   YourTable
WHERE  Height = (SELECT MAX(Height) FROM YourTable)           

個人的には、ステートメントが乱雑にならないので、CTE を使用することを好みます (この単純なケースでは正しくありませんが、実際には、サブセレクトよりもはるかに読みやすいことがよくあります)

于 2012-12-13T13:24:30.347 に答える
0

ここではサブクエリがありません。より複雑ですが、作成するのは面白かったです。

select ifnull(@d,@d:=actor_id),actor_id,if(@d>actor_id,1,0)as t 
from t1 having t=0 order by actor_id desc;

これが私のコンピューターの例です。

mysql> desc t1;
+-------------+----------------------+------+-----+---------------------+-------+
| Field       | Type                 | Null | Key | Default             | Extra |
+-------------+----------------------+------+-----+---------------------+-------+
| actor_id    | smallint(5) unsigned | NO   |     | 0                   |       |
| first_name  | varchar(45)          | NO   |     | NULL                |       |
| last_name   | varchar(45)          | NO   |     | NULL                |       |
| last_update | timestamp            | NO   |     | 0000-00-00 00:00:00 |       |
+-------------+----------------------+------+-----+---------------------+-------+
4 rows in set (0.00 sec)

mysql> select * From t1 order by actor_id desc limit 5;
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|    20001 | test       | test      | 2012-12-13 09:12:50 |
|    20001 | test       | test      | 2012-12-13 09:12:51 |
|     2000 | b          | a         | 0000-00-00 00:00:00 |
|     2000 | b          | a         | 0000-00-00 00:00:00 |
|     2000 | b          | a         | 0000-00-00 00:00:00 |
+----------+------------+-----------+---------------------+
5 rows in set (0.00 sec)

mysql>     select ifnull(@d,@d:=actor_id),actor_id,if(@d>actor_id,1,0)as t 
    ->     from t1 having t=0 order by actor_id desc;
+-------------------------+----------+---+
| ifnull(@d,@d:=actor_id) | actor_id | t |
+-------------------------+----------+---+
|                   20001 |    20001 | 0 |
|                   20001 |    20001 | 0 |
+-------------------------+----------+---+
2 rows in set (0.00 sec)
于 2012-12-13T14:06:03.550 に答える