如何根据最大值获取整行数据?

问题描述 投票:-2回答:3

我有一个带有使用计数器的Oracle表。我需要使用最大计数器值获取每个传感器的完整数据行?

对于ALO,我需要第2行中的数据。对于AMA,我需要第10行中的数据。对于A11,我需要第965行中的数据。对于MSP,我需要第9659行中的数据。

enter image description here

任何帮助将不胜感激!

谢谢,

戴夫

sql oracle plsql
3个回答
1
投票

您可以使用窗口功能。

selcet * from (
  select a.*, row_number() over (partition by facility_id_n
      order by usage_counter_n desc) rn
  from your_tbl a) 
where rn =1;

或者使用First窗口功能。


0
投票

如果每个FACILITY_ID_N有两行具有相同的USAGE_COUNTER_N值,则ROW_NUMBER将不会返回正确的结果。例如:

SQL> WITH test
  2       AS (SELECT 9640 ID_n, 'ALO' sensor_id_c, 317 usage_counter_n FROM DUAL
  3           UNION
  4           SELECT 9641, 'ALO', 18 FROM DUAL
  5           UNION
  6           SELECT 9642, 'ALO', 0 FROM DUAL
  7           UNION
  8           SELECT 9659, 'MSP', 25 FROM DUAL --> MAX for MSP ...
  9           UNION
 10           SELECT 9660, 'MSP', 10 FROM DUAL
 11           UNION
 12           SELECT 1000, 'MSP', 25 FROM DUAL --> ... but this is also MAX for MSP
 13          )
 14  SELECT *
 15    FROM (SELECT a.*,
 16                 ROW_NUMBER ()
 17                 OVER (PARTITION BY sensor_id_c
 18                       ORDER BY usage_counter_n DESC) rn
 19            FROM test a)
 20   WHERE rn = 1;

      ID_N SEN USAGE_COUNTER_N         RN
---------- --- --------------- ----------
      9640 ALO             317          1
      1000 MSP              25          1

SQL>

RANK可能会更好:

SQL> l16
 16*                ROW_NUMBER ()
SQL> c/row_number/rank
 16*                rank ()
SQL> /

      ID_N SEN USAGE_COUNTER_N         RN
---------- --- --------------- ----------
      9640 ALO             317          1
      1000 MSP              25          1
      9659 MSP              25          1

SQL>

或者,使用古老的方式:

 14    SELECT *
 15      FROM test t
 16     WHERE t.usage_counter_n = (SELECT MAX (t1.usage_counter_n)
 17                                  FROM test t1
 18                                 WHERE t1.sensor_id_c = t.sensor_id_c)
 19  ORDER BY sensor_id_c;

      ID_N SEN USAGE_COUNTER_N
---------- --- ---------------
      9640 ALO             317
      9659 MSP              25
      1000 MSP              25

SQL>

0
投票

根据您处理重复项的要求,KEEP子句也可能是一个有用的选项

SQL> with test
  2       AS (SELECT 9640 ID_n, 'ALO' sensor_id_c, 317 usage_counter_n FROM DUAL
  3           UNION
  4           SELECT 9641, 'ALO', 18 FROM DUAL
  5           UNION
  6           SELECT 9642, 'ALO', 0 FROM DUAL
  7           UNION
  8           SELECT 9659, 'MSP', 25 FROM DUAL --> MAX for MSP ...
  9           UNION
 10           SELECT 9660, 'MSP', 10 FROM DUAL
 11           UNION
 12           SELECT 1000, 'MSP', 25 FROM DUAL --> ... but this is also MAX for MSP
 13          )
 14  SELECT sensor_id_c,
 15         min(id_n) keep ( dense_rank first order by usage_counter_n DESC ) id_n,
 16         min(usage_counter_n) keep ( dense_rank first order by usage_counter_n DESC ) usage_counter_n
 17  from test
 18  group by sensor_id_c;

SEN       ID_N USAGE_COUNTER_N
--- ---------- ---------------
ALO       9640             317
MSP       1000              25
© www.soinside.com 2019 - 2024. All rights reserved.