繁体   English   中英

Oracle:DISTINCT或GROUP BY行一致性

[英]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行?

SQL小提琴

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

SQL小提琴演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM