【问题标题】:Trying to create a SQL query尝试创建 SQL 查询
【发布时间】:2015-11-10 16:20:48
【问题描述】:

我正在尝试创建一个查询,该查询仅检索 6 个月内取货次数最多的 10 家公司,这意味着取货场合,而不是取货数量。 我已经这样做了

【问题讨论】:

  • 提供我们可以使用的测试数据和预期结果会有用吗? SQLFiddle 会很好。从表定义开始。
  • 嗨,它的意思是返回两行。一个叫company_name(带有公司名称),另一个叫picks(公司已完成的取货次数。
  • 样本插入和预期输出(也许您可以说“我想要这 4 家公司中的前 2 名”)将极大地帮助我们能够为您提供帮助。
  • 我不明白“这意味着取件场合,而不是取件数量。”这部分,你到底想要什么?
  • 你应该看看 Dense_Rank 函数techonthenet.com/oracle/functions/dense_rank.php

标签: sql


【解决方案1】:
SELECT  * 
FROM    customer
JOIN (SELECT manifest.pickup_customer_ref reference,
             DENSE_RANK() OVER (PARTITION BY manifest.pickup_customer_ref ORDER BY COUNT(manifest.trip_id) DESC) rnk
      FROM   manifest 
      INNER JOIN trip ON manifest.trip_id = trip.trip_id
      WHERE trip.departure_date > TRUNC(SYSDATE) - interval '6' month
      GROUP BY manifest.pickup_customer_ref) cm ON customer.reference = cm.reference
WHERE cm.rnk < 11;

这使用dense_rank首先确定行程次数最多的订单或客户

【讨论】:

    【解决方案2】:

    嗯,我没有 Oracle,所以我无法 100% 测试它,但我相信您正在寻找类似以下的东西:

    请记住,当您使用分组依据时,您必须缩小到您在选择中分组依据的相同字段。希望这至少可以帮助您了解要查看的内容。

    select TOP 10 
        c.company_name,
        m.pickup_customer_ref,
        count(*) as 'count'
    from customer c
    inner join mainfest m on m.pickup_customer_ref = c.reference
    inner join trip t on t.trip_id = m.trip_id
    where t.departure_date < DATEADD(month, -6, GETDATE())
    group by c.company_name, m.pickup_customer_ref
    order by 'count', c.company_name, m.pickup_customer_ref desc
    

    【讨论】:

    • Oracle 不支持TOPDATEADD()GETDATE();并且列别名不能用单引号...
    • 我知道我讨厌甲骨文是有原因的! :-) 好吧,如果查找它们,可以轻松替换它们,但要点仍然相同。
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多