6

行の列のセットから2番目に大きい値を取得するには、単一のSQLクエリが必要です。たとえば、これらが私のテーブルの行である場合:

id | col1 | col2 | col3 | col4 | coln |
1  |   5  |   7  |   9  |  3   |  10  |
2  |   13 |   14 |   2  |  54  |  11  |

rowid 1の場合-値9が必要です、rowid2-値14が必要です

4

3 に答える 3

5

一般的なテーブル式やウィンドウ関数がなく、プロシージャの記述に頼らなければ、MySQLではこれがひどく冗長になるのではないかと心配しています。

SELECT t.id, t.val second_largest
-- unpivot your columns into a table
FROM (
  SELECT id, col1 val FROM my_table UNION ALL
  SELECT id, col2     FROM my_table UNION ALL
  SELECT id, col3     FROM my_table UNION ALL
  SELECT id, col4     FROM my_table UNION ALL
  SELECT id, coln     FROM my_table
) t

-- retain only those records, where there exists exactly one record with a
-- column value greater than any other column value with the same id
WHERE 1 = (
  SELECT COUNT(*) 
  -- Here, use unions to be sure that every value appears exactly once
  FROM (
    SELECT id, col1 val FROM my_table UNION
    SELECT id, col2     FROM my_table UNION
    SELECT id, col3     FROM my_table UNION
    SELECT id, col4     FROM my_table UNION
    SELECT id, coln     FROM my_table
  ) u
  WHERE t.id = u.id
  AND t.val < u.val
)

これがそれをチェックするためのSQLFiddleです(スキーマのヘッズアップをしてくれたbluefeetに感謝します!)。上記のソリューションでは、最大の列値が複数回表示されている場合でも、すべての行で2番目に大きい列値が検出されます。

于 2013-01-09T11:21:38.363 に答える
3

これを行うには、データのピボットを解除してから、グループ内の各レコードに行番号を適用しidます。unpivotは、列レイアウトからデータを取得して行に配置するため、2番目に高い値を簡単に判別できます。

select id, col, value
from
(
  -- assign a group row number to each record 
  select *, 
    @row:=(case when @prev=id and @prevvalue<>value then @row else 0 end) + 1 as rownum,
    @prevvalue:=value,
    @prev:=id pid
  from
  (
    -- unpivot the multi columns into row values
    select id, 'col1' col, col1 value
    from yourtable
    union all
    select id, 'col2' col, col2 value
    from yourtable
    union all
    select id, 'col3' col, col3 value
    from yourtable
    union all
    select id, 'col4' col, col4 value
    from yourtable
    union all
    select id, 'coln' col, coln value
    from yourtable
  ) src
  order by id, value desc
) src
-- apply filter looking for the rownumber = 2 which is the second highest based on order
where rownum = 2

SQL FiddlewithDemoを参照してください

結果は次のようになります。

| ID |  COL | VALUE |
---------------------
|  1 | col3 |     9 |
|  2 | col2 |    14 |
于 2013-01-09T11:21:18.100 に答える
0
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);

これにより、特定の列で2番目に大きい整数値が得られます。

編集:それを行う前に、行と列を入れ替えるだけです。ただし、列が動的である場合は、かなり注意が必要です。

最善/最も簡単な方法は、この特定の操作にSQLではなく、クライアント側の言語を直接使用することです。不可能な場合は、次のことを確認してください。集計せずに行と列を転置する

于 2013-01-09T11:18:25.737 に答える