当前位置: 首页 > 面试题库 >

获得每个类别的十大产品

郎刚捷
2023-03-14
问题内容

我有这样的查询

SELECT 
t.category, 
tc.product, 
tc.sub-product,
 count(*) as sales 
 FROM tg t, ttc tc
 WHERE t.value = tc.value
 GROUP BY t.category, tc.product, tc.sub-product;

现在,在我的查询中,我想获得每个类别的前10个产品(按销售量排名最高),并且每个类别我需要前5个子类别(按销售量排名前列)

您可以假设问题陈述是这样的:

按销售获得每个类别的前10个产品,按销售获得每个5个子产品。

  • 这里的类别可以是书籍
  • 产品可以是Harry Porter的书
  • 子产品可以是HarryPorter系列5

样本输入数据格式

category |product |subproduct |Sales [count (*)]

abc   test1    test11     120

abc   test1    test11     100

abc   test1    test11     10

abc   test1    test11     10

abc   test1    test11     10

abc   test1    test11     10

abc   test1    test12     10

abc   test1    test13     8

abc   test1    test14     6

abc   test1    test15     5

abc   test2    test21     80

abc   test2    test22     60

abc   test3    test31     50

abc   test3    test32     40

abc   test4    test41     30

abc   test4    test42     20

abc   test5    test51     10

abc   test5    test52     5

abc   test6    test61     5

|

|

|

bcd   test2    test22     10

xyz   test3    test31     5

xyz   test3    test32     3

xyz   test4    test41     2

输出将是“

top 5 rf for (abc) -> abc,test1(289) abc,test2 (140), abc test3 (90), abc test4(50) , abc test5 (15)

top 5 rfm for (abc,test1) -> test11(260),test12(10),test13(8),test14(6),test15(5) and so on

我的查询失败,因为结果确实很大。我正在阅读有关诸如rank之类的oracle分析功能的信息。有人可以帮我使用解析函数修改此查询。任何其他方法也可以起作用。

我指的是http://www.orafaq.com/node/55。但是无法为此获得正确的sql查询。

任何帮助,将不胜感激..我想在此停留两天:(


问题答案:

可能有一些原因不使用分析函数,而是 使用分析函数:

select am, rf, rfm, rownum_rf2, rownum_rfm
from
(
    -- the 3nd level takes the subproduct ranks, and for each equally ranked
    -- subproduct, it produces the product ranking
    select am, rf, rfm, rownum_rfm,
      row_number() over (partition by rownum_rfm order by rownum_rf) rownum_rf2
    from
    (
        -- the 2nd level ranks (without ties) the products within
        -- categories, and subproducts within products simultaneosly
        select am, rf, rfm,
          row_number() over (partition by am order by count_rf desc) rownum_rf,
          row_number() over (partition by am, rf order by count_rfm desc) rownum_rfm
        from
        (
            -- inner most query counts the records by subproduct
            -- using regular group-by. at the same time, it uses
            -- the analytical sum() over to get the counts by product
            select tg.am, ttc.rf, ttc.rfm,
              count(*) count_rfm,
              sum(count(*)) over (partition by tg.am, ttc.rf) count_rf
            from tg inner join ttc on tg.value = ttc.value
            group by tg.am, ttc.rf, ttc.rfm
        ) X
    ) Y
    -- at level 3, we drop all but the top 5 subproducts per product
    where rownum_rfm <= 5   -- top  5 subproducts
) Z
-- the filter on the final query retains only the top 10 products
where rownum_rf2 <= 10  -- top 10 products
order by am, rownum_rf2, rownum_rfm;

我使用rownum而不是等级,因此您永远不会获得联系,换句话说,联系将是随机决定的。如果数据不够密集(前10个产品中的任何5个子产品少于-
可能显示其他产品的子产品),这也将不起作用。但是,如果数据密集(建立的数据库很大),则查询应该可以正常工作。

下面的数据进行了两次传递,但在每种情况下均返回正确的结果。同样,这是一个无联系等级查询。

select am, rf, rfm, count_rf, count_rfm, rownum_rf, rownum_rfm
from
(
    -- next join the top 10 products to the data again to get
    -- the subproduct counts
    select tg.am, tg.rf, ttc.rfm, tg.count_rf, tg.rownum_rf, count(*) count_rfm,
        ROW_NUMBER() over (partition by tg.am, tg.rf order by 1 desc) rownum_rfm
    from (
        -- first rank all the products
        select tg.am, tg.value, ttc.rf, count(*) count_rf,
            ROW_NUMBER() over (order by 1 desc) rownum_rf
        from tg
        inner join ttc on tg.value = ttc.value
        group by tg.am, tg.value, ttc.rf
        order by count_rf desc
        ) tg
    inner join ttc on tg.value = ttc.value and tg.rf = ttc.rf
    -- filter the inner query for the top 10 products only
    where rownum_rf <= 10
    group by tg.am, tg.rf, ttc.rfm, tg.count_rf, tg.rownum_rf
) X
-- filter where the subproduct rank is in top 5
where rownum_rfm <= 5
order by am, rownum_rf, rownum_rfm;

列:

count_rf : count of sales by product
count_rfm : count of sales by subproduct
rownum_rf : product rank within category (rownumber - without ties)
rownum_rfm : subproduct rank within product (without ties)


 类似资料:
  • 我在我的ASP.NET 4.5网络项目中使用了实体框架。我有一个产品表,每个产品都有其类别和子类别。一个类别可能没有子类别。 餐桌产品 id 名称 category_id 子类别_id 日期 表类别 category_id parent_category_id 如果该类别具有,则它是父类别,否则它是同一表中另一个类别的子类别。 我想在Entity Framework中创建一个查询,按日期从最新到最

  • 这是一个产品的表格结构 这是类别的表结构 我在为包括嵌套类别在内的每个类别选择产品计数时遇到困难。例如,类别有1个产品,类别有1个产品,类别有1个产品,并且由于类别和是类别的各自直接/间接祖先,类别有3个产品。所以我需要一个查询或只是一种方法来获得这样的东西: 是否可以只使用SQL,或者我需要添加一些PHP?

  • 问题内容: 我想抢购10种订购最多的产品。我的表看起来像这样: 产品 订购产品 命令 目前,我有以下几点: 我在上面的查询中已经指出,我不确定该放置什么。如何按订购产品表中显示的产品数量订购产品? 问题答案: 它将给您10个项目,每个项目都包含产品对象,以及numberOfOrders整数。 编辑 : 由于这将作为方法的返回值,并且由于C#不允许返回匿名类型(因此C.4.0中仍具有此功能),因此您

  • 我对数据库非常陌生,我想知道原始sql查询。我有两个表Category和Product,Product表有一个foreign_key(Category_id)。 如何获得每个类别有10个产品的所有类别?所以我将在第一页显示每个类别名称和10个产品。 并且还想查询该产品的评论表。如何连接两个表(类别和产品(1),评论(2)

  • 问题内容: 问候大家。我有一个SQL 2008 Express数据库,名称为tbl_Merchant,如下所示: 我需要找到在过去12个月内每月销售量排名前10位的商家。 如果只有一个月,这是非常容易的。 但是,如果我想在12个月内找到它们,我就会陷入困境。我需要显示120个商人,这是每个月的前10名销售商人。目前,我的解决方案是将第1个月到第12个月的12个表合并在一起,但是我认为这不是一个好方

  • 我有两个表产品和类别。1个类别有许多产品。在索引页面上,我只想显示一个属于每个类别的最新产品。换句话说,一个产品一个类别。 这是我的表结构 类别表 我尝试了很多答案,但无法理解他们回答的问题。所以请推荐我查询,并尽可能详细说明。