oracle 使用group by函数的重复项计数

wlsrxk51  于 2023-08-04  发布在  Oracle
关注(0)|答案(2)|浏览(147)

我有一个表如下。
| 用户名|型号|计数| Count |
| --|--|--| ------------ |
| ABC|满|||
| BCD| CON|||
| ABC| CON|||
| ABC|满|||
| XYZ|满|||
我想填充ID如下
| 用户名|型号|计数| Count |
| --|--|--| ------------ |
| ABC|满|二个| 2 |
| BCD| CON|一个| 1 |
| ABC| CON|一个| 1 |
| ABC|满|二个| 2 |
| XYZ|满|一个| 1 |
我想计数列被更新的记录数量可用于组(用户名,类型)基本上是想为用户名重复记录的数量||输入计数

fcy6dtqo

fcy6dtqo1#

请注意,“Full”与“FULL”不同,因此可能会绊倒您。为了实现您想要的功能,您可以创建一个类似这样的update语句,基本上是通过使用GROUP BY计数出现次数,并使用正确的where语句来获得计数。
另外,尽量避免将保留名称TYPECOUNT作为列名。

UPDATE MY_TABLE A SET COUNT = 
(
  SELECT COUNT(1) 
  FROM MY_TABLE B
  WHERE A.USER_NAME = B.USER_NAME
    AND LOWER(A.TYPE) = LOWER(B.TYPE)
  GROUP BY USER_NAME, LOWER(TYPE)
);

字符串
看看这个例子:db<>fiddle

mccptt67

mccptt672#

您可以使用MERGE语句和ROWID伪列上相关的COUNT解析函数:

MERGE INTO orders dst
USING (
  SELECT COUNT(*) OVER (PARTITION BY user_name, UPPER(type)) AS cnt
  FROM   orders
) src
ON (src.ROWID = dst.ROWID)
WHEN MATCHED THEN
  UPDATE SET Count = src.cnt;

字符串
其中,对于样本数据:

CREATE TABLE orders ( USER_ID, USER_NAME, Type, Count) AS
SELECT  1, 'ABC', 'Full', CAST(NULL AS NUMBER) FROM DUAL UNION ALL  
SELECT 15, 'BCD', 'CON',  NULL FROM DUAL UNION ALL  
SELECT 19, 'ABC', 'CON',  NULL FROM DUAL UNION ALL
SELECT 13, 'ABC', 'FULL', NULL FROM DUAL UNION ALL
SELECT 16, 'XYZ', 'FULL', NULL FROM DUAL;


然后,在MERGE之后,该表包含:
| 用户名|类型|计数| COUNT |
| --|--|--| ------------ |
| ABC|满|二个| 2 |
| BCD| CON|一个| 1 |
| ABC| CON|一个| 1 |
| ABC|满|二个| 2 |
| XYZ|满|一个| 1 |
fiddle

相关问题