sql - 如何使用 group by 检索不同的数据

我有下表及其示例数据,

+------------------+-------+--------+---------------------+-------+
| PhoneCode        | SeqID | Active | Token               | CUSID |
+------------------+-------+--------+---------------------+-------+
| e29a5e1c695352b8 | 3898  | I      | JYN8CYRVzaKWL-l_K   | 50002 |
+------------------+-------+--------+---------------------+-------+
| e29a5e1c695352b8 | 3900  | I      | JYN8CYRVzaKWL-l_K   | 50002 |
+------------------+-------+--------+---------------------+-------+
| 741fb28bc72183e3 | 3899  | I      | RU3ReKEw0yin9LxZWCO | 50002 |
+------------------+-------+--------+---------------------+-------+
| 741fb28bc72183e4 | 3901  | A      | RU3ReKEw0yin9LxZWCO | 50002 |
+------------------+-------+--------+---------------------+-------+

我需要使用最新的 SeqID 来区分 PhoneCode。所以我尝试了以下查询。

SELECT UD.PHONECODE, UD.SeqID, UD.ACTIVE, UD.Token
FROM   DEVICE UD
WHERE UD.CUSID = '50002' AND UD.ACTIVE = 'I'
GROUP BY PHONECODE

但是它会出错。如何检索以下输出?

+------------------+-------+--------+---------------------+-------+
| PhoneCode        | SeqID | Active | Token               | CUSID |
+------------------+-------+--------+---------------------+-------+
| e29a5e1c695352b8 | 3900  | I      | JYN8CYRVzaKWL-l_K   | 50002 |
+------------------+-------+--------+---------------------+-------+
| 741fb28bc72183e3 | 3899  | I      | RU3ReKEw0yin9LxZWCO | 50002 |
+------------------+-------+--------+---------------------+-------+

最佳答案

你可以在没有 GROUP BY 和没有自连接的情况下做到这一点:

SELECT PHONECODE,
       SeqID,
       ACTIVE,
       Token
FROM   (
  SELECT d.*,
         ROW_NUMBER() OVER (PARTITION BY phonecode ORDER BY seqid DESC) AS rn
  FROM   device d
  WHERE  cusid = 50002
  AND    active = 'I'
)
WHERE  rn = 1;

或者,如果你想使用GROUP BY,那么你也可以使用KEEP:

SELECT PHONECODE,
       MAX(SeqID) AS seqid,
       MAX(ACTIVE) KEEP (DENSE_RANK LAST ORDER BY SeqID) AS active,
       MAX(Token) KEEP (DENSE_RANK LAST ORDER BY SeqID) AS token
FROM   device
WHERE  cusid = 50002
AND    active = 'I'
GROUP BY phonecode;

其中,对于示例数据:

CREATE TABLE device (PhoneCode, SeqID, Active, Token, CUSID ) AS
SELECT 'e29a5e1c695352b8', 3898, 'I', 'JYN8CYRVzaKWL-l_K',   50002 FROM DUAL UNION ALL
SELECT 'e29a5e1c695352b8', 3900, 'I', 'JYN8CYRVzaKWL-l_K',   50002 FROM DUAL UNION ALL
SELECT '741fb28bc72183e3', 3899, 'I', 'RU3ReKEw0yin9LxZWCO', 50002 FROM DUAL UNION ALL
SELECT '741fb28bc72183e4', 3901, 'A', 'RU3ReKEw0yin9LxZWCO', 50002 FROM DUAL;

两个输出:

PHONECODE SEQID ACTIVE TOKEN
741fb28bc72183e3 3899 I RU3ReKEw0yin9LxZWCO
e29a5e1c695352b8 3900 I JYN8CYRVzaKWL-l_K

db fiddle here

https://stackoverflow.com/questions/71754206/

相关文章:

c - 为什么静态链接的 "hello world"程序这么大(超过 650 KB)?

c - 在格式控制字符串中使用消息

ios - 在 SwiftUI 中声明 Binding 属性有什么区别?

authentication - 是 CQRS 中的登录/注册命令或查询

java - 如何在 Java 中创建包含运算符的变量?

haskell - 在 Haskell 中日志记录功能的不同实现之间切换的有效方法?

go - 函数参数的求值顺序是什么?

python - `__ge__` 在 dict.values() 上使用时失败

python - 将列表附加到现有数据框

c# - System.IO.Directory.Exists 在 LINQ 语句中失败,但在 fo