簡體   English   中英

選擇具有混合值的N行

[英]Select N Rows With Mixed Values

我有一個像列一樣的表

insertTimeStamp, port, data
1              , 20  , 'aaa'
2              , 20  , 'aba'
3              , 20  , '3aa'
4              , 20  , 'aab'
2              , 21  , 'aza'
5              , 21  , 'aha'
8              , 21  , 'aaa'
15             , 22  , '2aa'

現在我需要來自該表的N行(Say 4),通過insertTimeStamp命令asc。 但如果可能的話,我想從不同的port獲取它們。

所以結果應該是:

1              , 20  , 'aaa'
2              , 20  , 'aba'
2              , 21  , 'aza'
15             , 22  , '2aa'

如果port中沒有足夠的不同值,我想選擇具有最低insertTimeStamp的剩余值。

SQL小提琴演示

如您所見,我創建了一個group_id因此group_id = 1將是每個端口的較小TimeStamp

第二個字段是time_id所以在我選擇所有1后的ORDER BY為所有端口帶來所有2,3,4

   SELECT *
   FROM (
         SELECT *, 
            row_number() over (partition by "port" order by "insertTimeStamp") group_id,
            row_number() over (order by "insertTimeStamp") time_id
         FROM Table1 T
   ) as T
   ORDER BY CASE 
               WHEN group_id = 1 THEN group_id
               ELSE time_id
            END
   LIMIT 4

OUTPUT

| insertTimeStamp | port | data | group_id | time_id |
|-----------------|------|------|----------|---------|
|               1 |   20 |  aaa |        1 |       1 |
|               2 |   21 |  aza |        1 |       3 |
|              15 |   22 |  2aa |        1 |       8 |
|               2 |   20 |  aba |        2 |       2 |

使用row_number():

select *
from (
    select insertTimeStamp, port, data
    from (
        select *, row_number() over (partition by port order by insertTimeStamp) rn
        from a_table
        ) alias
    order by rn, insertTimeStamp
    limit 4
    ) alias
order by 1, 2;

 inserttimestamp | port | data 
-----------------+------+------
               1 |   20 | aaa
               2 |   20 | aba
               2 |   21 | aza
              15 |   22 | 2aa
(4 rows)

SqlFiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM