19

テーブルに次のデータがあります。

id  name    alarmId  alarmUnit  alarmLevel

1   test    voltage  psu        warning
2   test    voltage  psu        ceasing
3   test    voltage  psu        warning
4   test    temp     rcc        warning
5   test    temp     rcc        ceasing

すべての列グループ (alarmId,alarmUnit) に関する最新情報のみを表示したいので、結果は次のようになります。

3   test    voltage  psu        warning
5   test    temp     rcc        ceasing

私はこれまでに試しました:

SELECT MAX(id) as id,name,alarmId,alarmUnit,alarmLevel GROUP BY alarmId,alarmUnit;

選択された ID は問題ないように見えますが、選択された行はそれらに対応していません。私たちを手伝ってくれますか?

4

5 に答える 5

29

OracleSQL Server 2005+およびPostgreSQL 8.4: _

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY alarmId, alarmUnit ORDER BY id DESC) AS rn
        FROM    mytable
        ) q
WHERE   rn = 1

MySQL

SELECT  mi.*
FROM    (
        SELECT  alarmId, alarmUnit, MAX(id) AS mid
        FROM    mytable
        GROUP BY
                alarmId, alarmUnit
        ) mo
JOIN    mytable mi
ON      mi.id = mo.mid

PostgreSQL 8.3と下:

SELECT  DISTINCT ON (alarmId, alarmUnit) *
FROM    mytable
ORDER BY
        alarmId, alarmUnit, id DESC
于 2009-08-19T12:26:29.787 に答える
19

最大の行を取得したい場合は、おそらくサブクエリが必要になります。何かのようなもの:

SELECT *
FROM YourTable
WHERE id IN (
    SELECT MAX(id) FROM YourTable GROUP BY alarmId, alarmUnit
    )
于 2009-08-19T12:24:15.637 に答える
8

試す:

SELECT * FROM table WHERE id IN
  (SELECT MAX(id) FROM table GROUP BY alarmId, alarmUnit)
于 2009-08-19T12:24:38.273 に答える
2
select id, name, alarmID, alarmUnit, alarmLevel
from (select max(id) as id
from table
group by alarmID, alarmUnit) maxID
inner join table
on table.id = maxID.id
于 2009-08-19T16:43:56.953 に答える
2

次のようなことを試してみてください。

SELECT id,name,alarmId,alarmUnit,alarmLevel
FROM table
WHERE id IN (SELECT Max(id) FROM table GROUP BY alarmId, alarmUnit)

サブクエリの選択に、alarmId と alarmUnit を含める必要がある場合があります。

于 2009-08-19T12:26:56.653 に答える