来自多个表的前 10 个不同值的问题

Posted

技术标签:

【中文标题】来自多个表的前 10 个不同值的问题【英文标题】:issue with top 10 distinct values from multiple tables 【发布时间】:2012-01-20 03:00:10 【问题描述】:

我的应用程序有 oracle 后端。该架构的设计使我将用户事务拆分为 12 个每月事务表。每个月一个。现在我想检索在给定日期范围内访问最多不同文档的前 10 个用户。 我目前有一个查询,它对每个用户的文档进行 countDistinct,按此计数的 desc 顺序排序并从中选择前 10 个结果。 我对每个表运行此查询,所有结果都附加到一个列表中。我必须扫描此列表并对每月计数进行总和,然后按 user_id 分组以获取所有 12 个月内每个用户的文档总数。 我意识到这个计数不是正确的计数,因为同一用户在不同月份可能访问了相同的文档。按照我目前的逻辑,这些计数会加起来。

我需要知道我应该使用哪种策略,这样结果才会最准确。我知道一种方法是从单个表中查询,这肯定会给我正确的答案,但我能达到同样的结果吗从查询所有 12 个表?

这里是一月份的示例月表

class TxnSummJan 
    Long id 
    Transaction trans
    Users grauser
    Resources graresource
    Integer transactioncount
    Date lastaccesseddate
    Date currentdate 
    String accountid
    String userlocation

    String documentname

    String eventdesc
    

每个月的类似表格..

【问题讨论】:

【参考方案1】:

又是我。 您能否将UNION ALL 应用于所有 12 个表,然后将其变为视图?

SELECT
  documentname,
  user,
  accesscount
  --and other columns
FROM
(
    SELECT 
      documentname,
      user,
      accesscount
      --and other columns
    FROM
      txn_jan

    UNION ALL

    SELECT 
      documentname,
      user,
      accesscount
      --and other columns
    FROM
      txn_feb

    --and other monthly summary tables

) yearly_summary

【讨论】:

如果我正确理解 OP,就不会有重复,因为不同的表代表事务集合的不相交子集。所以你应该使用UNION ALL而不是UNION,这样数据库就不会浪费时间检查重复了。 所以对 12 个表的“选择不同的文档名称 groupby 用户,日期之间”进行联合,创建视图然后再次按用户计数(documentnames)组? @pri_dev 你需要像上面那样创建一个视图,然后只做一个select distinct document..。 @David Wallace 同意,性能问题是这里的一个问题。 我想我可能想尝试比较查询单父表和12表并集视图的性能..【参考方案2】:

您可以创建一个视图,它对所有 12 个表执行 union all。然后从视图中选择。

【讨论】:

以上是关于来自多个表的前 10 个不同值的问题的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access - 具有来自不同表的多个条件的 Dlookup

Excel:来自不同工作表的 VLOOKUP

在 s-s-rS Report Builder Execute(@Query) 中对列标题使用动态 SQL - 使用来自 1 个表的值作为来自不同表的值的列标题

来自两个不同表的Mysql计数和总和

如何连接来自多个表的数据,保留所有不同的值

来自多个输入文件的填充表