【问题标题】:SQL - Find patterns of recordsSQL - 查找记录模式
【发布时间】:2009-08-12 01:13:11
【问题描述】:

这里是新手,所以请耐心等待......

是否有可能找到记录的模式?

我需要在广播编程软件的输出中找到重复的歌曲序列。

电台经理想知道某些歌曲是否会随着时间的推移在某些其他歌曲“旁边”重复,即 DJ 是否变得懒惰并重复某些序列。

  1. 表格按时间戳排序(播放日期时间)
  2. 'next'定义为:

a) 连续(歌曲 x 的记录编号为 n,歌曲 y 的记录编号为 n+1)或

b) 由一个广告分隔(歌曲 x 的收录编号为 n,广告的收录编号为 n+1,歌曲 y 的收录编号为 n+2)

似乎无法找到获取所需信息的方法。有什么想法吗?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    如果是一首又一首的歌曲,假设一个名为 tblSongs 的表带有一个“序列”和“名称”列。您可能想尝试类似

    select top N first.name, second.name, count(*)
    from tblSongs as first 
         inner join tblSongs as second
             on second.sequence=first.sequence + 1
    group by first.name, second.name
    order by count(*) desc
    

    如果歌曲序列 X,Y 与 Y,X 计数相同,则

    select top N first.name, second.name, count(*)
    from tblSongs as first 
         inner join tblSongs as second
             on second.sequence=first.sequence + 1
             or second.sequence=first.sequence - 1
    group by first.name, second.name
    order by count(*) desc
    

    如果您正在寻找 2 首歌曲序列的任何模式,那么

    select first.name, second.name, abs(second.sequence - first.sequence) as spacing_count
    from tblSongs as first 
         inner join tblSongs as second
             on second.sequence=first.sequence + 1
             or second.sequence=first.sequence - 1
    

    然后对spacing_count做一些统计分析(这超出了我的范围)。

    我相信这些会让你开始。

    【讨论】:

    • 好吧,一杆进洞!谢谢你,约翰,我相信你给了我我想做的事情的基础。现在进行费力的手动交叉检查(叹气)
    【解决方案2】:

    我不确定您是否可以通过直接数据库查询来找到它,但如果您可以将 ResultSet 转储到按时间戳排序的文件中,应该很容易弄清楚。

    这样想。假设一首歌是一个字符,而时间戳排序的歌曲列表是一个字符串。例如。你有一个由以下表示的歌曲列表,其中 A B 和 C 是独特的歌曲:

    ABCACBABC                 (Ignore ads for now)
    

    现在您可以将其分解为相邻两个字符的子序列(称为二元组)。

    你得到的二元组是:

    AB, BC, CA, AC, CB, BA, BC
    

    现在您可以清楚地看到二元 BC 是重复的。要以编程方式执行此操作,您可以将每个二元组放入 HashMap(或 Hashtable/HashSet)中,并根据 HashMap 查询每个新的二元组以查看它是否包含它。如果地图已经包含它,那么它是重复的。如果不是,那就是新的,所以放到地图上吧。

    在本练习结束时,您将知道哪些组合是重复的。

    现在来看广告存在的情况,我们将所有广告称为 X。考虑顺序

    ABCXABCXXABCABC
    

    无论您连续有多个广告,(用硬换行符替换它(您将字符串分成多个字符串)。您将得到

    ABCXABC
    

    XX - 被换行>

    ABCAB
    

    现在用空字符串替换所有单个广告。你会得到

    ABCABC
    ABCAB
    

    现在独立处理每个字符串以识别重复。

    希望它有效。

    【讨论】:

    • 感谢您的及时答复。麦金太尔先生的提问暂时满足了我的需求。但是...我预见到将来会出现更奇怪的查询,而且它们可能不会像这个一样容易解决。所以我会记住你的想法,因为它非常灵活。感谢你们俩的帮助。顺便说一句,我在查询末尾使用 SQLite: 'top N' -> 'limit N'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2013-07-27
    • 1970-01-01
    • 2021-12-29
    • 2015-02-14
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多