1

各ユーザーの最速のレコードを返す select ステートメントの作成に本当に苦労しています。秒数が同数の場合は、最も低い「クリック数」を選択する必要があります。

テーブルに次のレコードがある場合

user    seconds     clicks
1       10.23       10
1       10.12       12
1       10.12       14
2       12.11       16
3       12.34       18
3       12.00       16

各ユーザーの時間とクリック数を最小限にする必要があるため、返すクエリが必要です

user    seconds    clicks
1       10.12       12
2       12.11       16
3       12.00       16

私が試したクエリは

select user, min(seconds), min(clicks) from mytable group by user

しかし、10.12 秒を選択し、ユーザー 1 に対して 10 をクリックしますが、これは正しくありません。これを 1 つのクエリで実行できますか?

4

3 に答える 3

0

これはうまくいくはずです

SELECT c.userid, c.seconds, min(c.clicks) FROM clicks as c
INNER JOIN (select userid, min(seconds) as s from clicks group by userid) AS sq 
ON (c.userid=sq.userid AND c.seconds=sq.s) group by c.userid;

しかし、参加なしではそれを行うことはできません。

列とテーブルの名前を変更する必要がある場合があります。

于 2012-12-09T21:47:09.437 に答える
0

以下のように、self との内部結合を試してください。

 select a.user, a.seconds, a.clicks 
 from mytable a JOIN
      (SELECT user, min(seconds) as MIN_SECONDS
       FROM mytable 
       GROUP BY USER) AS b
 ON a.user = b.user AND a.seconds = b.MIN_SECONDS;
于 2012-12-09T21:02:14.083 に答える
0

greatest-n-per-groupこれは、頻繁に発生する問題のバリエーションです。

SELECT m.*
FROM mytable AS m
LEFT OUTER JOIN mytable AS m2 ON m.user = m2.user
  AND (m.seconds > m2.seconds OR m.seconds = m2.seconds AND m.clicks > m2.clicks)
WHERE m2.user IS NULL;

説明:

m秒数が最も少ない各ユーザーの行、または秒数が同点の場合はクリック数が最も少ない行になりたいと考えています。つまり、そのユーザーには、秒数またはクリック数が少ない行が他にないようにする必要があります。

除外結合を使用して、秒数またはクリック数が少ない行を見つけようとします。そのような行が見つからない場合mは、値が最も低い行になります。


秒数とクリック数が最も少ない行が複数ある場合は、同点になり、ユーザーに複数の行が返される可能性があります。その場合、できれば一意の他の列との関係を解決する必要があります。

例:

SELECT m.*
FROM mytable AS m
LEFT OUTER JOIN mytable AS m2 ON m.user = m2.user
  AND (m.seconds > m2.seconds OR m.seconds = m2.seconds AND (m.clicks > m2.clicks
  OR m.clicks = m2.clicks AND m.id > m2.id))
WHERE m2.user IS NULL;
于 2012-12-09T21:04:28.417 に答える