【问题标题】:How to select only records that have minimum number of occurrence in a table?如何仅选择表中出现次数最少的记录?
【发布时间】:2014-07-17 12:35:12
【问题描述】:

我的数据库的简化示例是一个表

        CN REG#         CAPACITY
---------- ---------- ----------
         0 LUCY02          43000
         6 QRT834           5550
         3 SYF777           3333
        12 PKR768           1234
         5 SST005          12000
         6 KKK007          10000
         3 PKR008          22000

这是通过连接两个表创建的。这是join语句:

select count(tp.reg#) as cn,t.reg#,  CAPACITY
from truck t
join trip tp 
on  t.reg# = tp.reg#
group by tp.reg#,  CAPACITY, t.reg#

现在,我如何编写一个语句来仅打印出现次数最少且非零的行。在我们的示例中,它是 3。

预期输出是

     3 SYF777           3333
     3 PKR008          22000

到目前为止我所做但没有工作的是:

select count(tp.reg#) as cn,t.reg#,  CAPACITY
from truck t
left join trip tp 
on  t.reg# = tp.reg#
left join
(                       
    select dd, min(d) as ds
    from(
        select count(*)as d, ti.CAPACITY, ti.reg# as dd
        from truck ti, trip tp 
        where tp.reg# = ti.reg#
        group by ti.reg#, ti.CAPACITY
    )
    group by dd
)
on t.reg# = dd
group by tp.reg#,  CAPACITY, t.reg#

【问题讨论】:

标签: sql oracle join oracle11g


【解决方案1】:

如果您想根据“count”等聚合函数过滤查询,只需在“have”语句中添加此过滤器:

select count(tp.reg#) as cn,t.reg#,  CAPACITY
from truck t
join trip tp 
on  t.reg# = tp.reg#
group by tp.reg#,  CAPACITY, t.reg#
having count(tp.reg#) >= 3

如果你想动态查询最少出现的记录,你可以使用下面的代码:

select count(tp.reg#) as cn,t.reg#,  CAPACITY
from truck t
join trip tp 
on  t.reg# = tp.reg#
group by tp.reg#,  CAPACITY, t.reg#
having count(tp.reg#) = (select distinct top 1 count(tp.reg#) cn
                         from truck t
                         join trip tp 
                         on  t.reg# = tp.reg#
                         group by tp.reg#,  CAPACITY, t.reg#
                         having count(tp.reg#) >0
                         order by cn)

【讨论】:

  • 我想你假设不为零的最小值总是三。
  • Bernard 询问了一种返回最少出现 3 次的行的方法。因此,您可以将上面代码中的数字“3”更改为任何所需的数字。
  • 感谢您的回答,但我想通过变量最小变量对其进行过滤。如果我再添加一条 cn=2 的记录,它将不起作用。正如我在上面的示例中所说的那样,它是 3。佣兵
  • 感谢您的评论。根据您的情况,我在代码中添加了一些额外的行。我认为它比“Alexis Sánchez Tello”的代码更优化。
  • 是的,我觉得你的代码加上了动态特性,使用have更加简洁明了。
【解决方案2】:

你好,你可以试试这个,

 select * from 
       (select count(tp.reg#) as cn,t.reg#,  CAPACITY
       from truck t
       join trip tp 
       on  t.reg# = tp.reg#
       group by tp.reg#,  CAPACITY, t.reg#)
  where cn = (select min(cn) from (select count(tp.reg#) as cn,t.reg#,  CAPACITY
                                      from truck t
                                      join trip tp 
                                      on  t.reg# = tp.reg#
                                      where cn > 0
                                      group by tp.reg#,  CAPACITY, t.reg#))

希望对你有用... 谢谢

【讨论】:

  • 此解决方案独立于 min(cn) 的值,它适用于这个特定值(在本例中为 3)和 min(cn) 可能具有的值。
  • 如果您知道 min(cn) 始终为 3,您可以使用 HAVING COUNT(CN) > 3。但我认为并非如此。
【解决方案3】:

您只需要对动态视图进行几次转换并在中途添加过滤:

    select min(y.cn) , y.REG#, y.CAPACITY
from 
(
    select x.CN, x.REG#, x.CAPACITY 
    FROM 
    (
        select count(tp.reg#) as cn,t.reg#,  CAPACITY
        from truck t
        join trip tp 
        on  t.reg# = tp.reg#
        group by tp.reg#,  CAPACITY, t.reg#
    ) X
    WHERE x.cn != 0
) y
group by y.REG#, y.CAPACITY

.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2013-06-10
    • 1970-01-01
    • 2014-09-10
    • 2022-01-17
    • 2012-07-08
    相关资源
    最近更新 更多