我有下表及其样本数据如下:,

+------------------+-------+--------+---------------------+-------+
| 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 100

Sql相关问答推荐

Microsoft Access UNION将长文本字段限制为255个字符

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

从列的不同值创建列

在多个联合中使用相同的SELECT SQL查询

PostgreSQL中的合并命令是原子的,还是需要一些类似于SQL Server版本的内容?

如何在postgres函数中插入后返回布尔值?

收到%1、%2或%2邮箱的唯一客户

SQL计数条目大于日期,包括交叉表中的零

Select 列组(按同一表格中的另一列分组)Laravel 10

按用户和时间列出的SQL Group考勤列表

TSQL如何为群分配号码

每个学校 Select N个最新的行,但跳过同一学生的重复行

在Power Bi中将SQL代码转换为DAX

使用 XML 作为 SQL 表

如何解释 SQL Server 中的 Foxpro 语法?

识别SQL Server中的重复数字

每次计数器增加时通过运行总重置进行分组

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

如何在 PL/SQL 中区分返回的 XML 值?

使用分隔符拆分字符串并将它们放在 sql 中的多行中不起作用