【问题标题】:Select N Rows With Mixed Values选择具有混合值的 N 行
【发布时间】:2015-10-01 16:08:08
【问题描述】:

我有一张表格,里面有像

这样的列
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 行(例如 4),按insertTimeStamp 升序排列。 但如果可能的话,我想从不同的ports 获取它们。

所以结果应该是:

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

如果port 中没有足够的不同值,我想选择其余具有最低insertTimeStamp 的值。

【问题讨论】:

  • 根据您的标准,结果中的第 4 行应该是 3 , 20 , '3aa'?
  • @vkp 我不这么认为。当前的愿望输出看起来不错。从每个端口中选择第一个 insertTimeStamp,然后从其余端口中选择 TimeStamp 最低的

标签: sql postgresql select


【解决方案1】:

SQL Fiddle Demo

如您所见,我创建了一个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

输出

| 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 |

【讨论】:

    【解决方案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

    【讨论】:

    • 我很喜欢这个。对于此示例数据可能有效,但如果您有 rn = 2time = 15 将显示在 rn = 3time = 3 之前,您可能会错过它,因为 limit 4
    • 我不这么认为,你能给我一把小提琴吗?那是什么time??
    • 对不起我的意思是inserttimestamp这里sqlFiddle你可以看到第6个元素不是较小的。
    • 谢谢。这是有意的,按inserttimestamp 的顺序为每个组平均分配多余的行。也许这是一个解释问题,因为假设并不完全清楚。
    猜你喜欢
    • 2021-02-06
    • 2014-02-11
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多