[英]Oracle: DISTINCT or GROUP BY row consistency
我有下表:
Name Parent Status
A P1 0
A P2 1
B PB -1
在队列保证之后,结果数据将与单个行相关:
SELECT
DISTINCT Name, Parent, Status
FROM
MyTable
对于前。 结果集可能包含:
A, P1, 1
它与表中的任何行都不匹配。 如何编写一条SQL语句,用每个名称选择ANY和AT MOST ONE行?
SELECT DISTINCT
将获取每一行,然后丢弃结果集中的所有重复行。 您提供的数据在列中有重复项,但没有重复行-因此将返回所有行:
查询1 :
SELECT DISTINCT
Name,
Parent,
Status
FROM MyTable
结果 :
| NAME | PARENT | STATUS |
|------|--------|--------|
| A | P2 | 1 |
| B | PB | -1 |
| A | P1 | 0 |
对于前。 结果集可能包含:
A, P1, 1
不,您可以从以上结果中看到它不是。 但是,您可以执行以下查询:
查询2 :
SELECT Name,
MIN( Parent ),
MAX( Status )
FROM MyTable
GROUP BY Name
结果 :
| NAME | MIN(PARENT) | MAX(STATUS) |
|------|-------------|-------------|
| A | P1 | 1 |
| B | PB | -1 |
在回答您的最后一个问题:
如何编写一条SQL语句,用每个名称选择ANY和AT MOST ONE行?
此查询对行进行随机排序,然后为每个名称选择(随机)第一个:
查询3 :
WITH Randomness AS (
SELECT Name,
Parent,
Status,
ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY SYS.DBMS_RANDOM.VALUE() ) AS Random_ID
FROM MyTable
)
SELECT Name,
Parent,
Status
FROM Randomness
WHERE Random_ID = 1
结果 :
| NAME | PARENT | STATUS |
|------|--------|--------|
| A | P1 | 0 |
| B | PB | -1 |
如果您第二次运行查询3,则可能会返回另一个A
行(或者不是-这是随机的)。
或者,如果您想变得非常愚蠢且完全随机,则可以为每个名称选择一个随机的父级和一个随机状态(这样,“父级”和“状态”不必来自原始表的同一行)。
查询4 :
SELECT Name,
MIN( Parent ) KEEP ( DENSE_RANK FIRST ORDER BY SYS.DBMS_RANDOM.VALUE() ) AS Random_Parent,
MIN( Status ) KEEP ( DENSE_RANK FIRST ORDER BY SYS.DBMS_RANDOM.VALUE() ) AS Random_Status
FROM MyTable
GROUP BY Name
结果 :
| NAME | RANDOM_PARENT | RANDOM_STATUS |
|------|---------------|---------------|
| A | P1 | 1 |
| B | PB | -1 |
请试试:
SELECT
Name,
Parent,
Status
FROM(
select
Name,
Parent,
Status,
ROW_NUMBER()
OVER (PARTITION BY Name order by Status desc) RNum
From YourTable
)x where RNum=1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.