Oracle SQL,如何选择*具有不同的列

Tuo*_*nen 0 sql oracle oracle12c

我想要一个像这样的查询(这不起作用!)

select * from foo where rownum < 10 having distinct bar
Run Code Online (Sandbox Code Playgroud)

含义我想从列栏中的十个随机行中选择具有不同值的所有列.如何在Oracle中执行此操作?

这是一个例子.我有以下数据

| item    | rate |
-------------------
| a       | 50   |
| a       | 12   |
| a       | 26   |
| b       | 12   |
| b       | 15   |
| b       | 45   |
| b       | 10   |
| c       | 5    |
| c       | 15   |
Run Code Online (Sandbox Code Playgroud)

结果将是例如

| item no | rate |
------------------
| a       | 12 |  --from (26 , 12 , 50)
| b       | 45 | --from (12 ,15 , 45 , 10)
| c       | 5  | --from (5 , 15)
Run Code Online (Sandbox Code Playgroud)

总是有不同的项目没有

MT0*_*MT0 5

SQL小提琴

Oracle 11g R2架构设置:

生成一个包含12个项目的表格A- L每个项目都有费率0- 4:

CREATE TABLE items ( item, rate ) AS
SELECT CHR( 64 + CEIL( LEVEL / 5 ) ),
       MOD( LEVEL - 1, 5 )
FROM   DUAL
CONNECT BY LEVEL <= 60;
Run Code Online (Sandbox Code Playgroud)

查询1:

SELECT item,
       rate
FROM   (
  SELECT i.*,
         -- Give the rates for each item a unique index assigned in a random order
         ROW_NUMBER() OVER ( PARTITION BY item ORDER BY DBMS_RANDOM.VALUE ) AS rn
  FROM   items i
  ORDER BY DBMS_RANDOM.VALUE -- Order all the rows randomly
)
WHERE  rn = 1                -- Only get the first row for each item
AND    ROWNUM <= 10          -- Only get the first 10 items.
Run Code Online (Sandbox Code Playgroud)

结果:

| ITEM | RATE |
|------|------|
|    A |    0 |
|    K |    2 |
|    G |    4 |
|    C |    1 |
|    E |    0 |
|    H |    0 |
|    F |    2 |
|    D |    3 |
|    L |    4 |
|    I |    1 |
Run Code Online (Sandbox Code Playgroud)

  • @Tuomas Toivonen:想想你如何称呼这个"简单的关键词".`a_random_row_per_parameter1_limited_to_parameter2_random_result_rows(ID,10)`? (2认同)