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

透视SQLite表,像SQL一样设置

谭新知
2023-03-14
问题内容

我有一些数据。在SQLite数据库中,它的224,000行。我想从中提取时间序列信息以提供数据可视化工具。从本质上讲,数据库中的每一行都是一个事件,该事件具有(自严格时期以来)以秒为单位的时间-
日期组以及一个负责该事件的名称(除其他严格相关的事项外)。我想提取每个名称每个星期在数据库中有多少个事件。

这很简单:

SELECT COUNT(*), 
       name, 
       strf("%W:%Y", time, "unixepoch") 
  FROM events 
 GROUP BY strf("%W:%Y", time, "unixepoch"), name 
 ORDER BY time

我们得到了大约六千行数据

count          name        week:year  
23............ fudge.......23:2009  
etc...

但是我不想在每个星期都为每个名字排一行-我想为每个名字都排一个一行,每个星期都有一列,像这样:

Name      23:2009       24:2009    25:2009  
fudge........23............6............19  
fish.........1.............0............12  
etc...

现在,监视过程已经运行了69周,唯一名称的数量为502。显然,我不热衷于涉及对所有列进行硬编码而对行进行硬编码的任何解决方案。我对涉及迭代的任何事情都不太了解,例如使用python的executemany(),但是我愿意在必要时接受它。SQL是明智的,该死的。


问题答案:

在这种情况下,一种好的方法是不要将SQL推到令人费解,难以理解和维护的地步。让SQL尽其所能,然后在Python中对查询结果进行后处理。

这是我编写的简单交叉表生成器的简化版本。完整版提供行/列/总计。

您会注意到,它具有内置的“分组依据”-原始用例用于汇总使用Python和xlrd从Excel文件获得的数据。

您提供的row_keycol_key不必像示例中那样是字符串。它们可以是元组(例如(year, week)您的情况),也可以是整数(例如,您具有字符串列名到整数排序键的映射)。

import sys

class CrossTab(object):

    def __init__(
        self,
        missing=0, # what to return for an empty cell. Alternatives: '', 0.0, None, 'NULL'
        ):
        self.missing = missing
        self.col_key_set = set()
        self.cell_dict = {}
        self.headings_OK = False

    def add_item(self, row_key, col_key, value):
        self.col_key_set.add(col_key)
        try:
            self.cell_dict[row_key][col_key] += value
        except KeyError:
            try:
                self.cell_dict[row_key][col_key] = value
            except KeyError:
                self.cell_dict[row_key] = {col_key: value}

    def _process_headings(self):
        if self.headings_OK:
            return
        self.row_headings = list(sorted(self.cell_dict.iterkeys()))
        self.col_headings = list(sorted(self.col_key_set))
        self.headings_OK = True

    def get_col_headings(self):
        self._process_headings()
        return self.col_headings

    def generate_row_info(self):
        self._process_headings()
        for row_key in self.row_headings:
            row_dict = self.cell_dict[row_key]
            row_vals = [row_dict.get(col_key, self.missing) for col_key in self.col_headings]
            yield row_key, row_vals

    def dump(self, f=None, header=None, footer='', ):
        if f is None:
            f = sys.stdout
        alist = self.__dict__.items()
        alist.sort()
        if header is not None:
            print >> f, header
        for attr, value in alist:
            print >> f, "%s: %r" % (attr, value)
        if footer is not None:
            print >> f, footer

if __name__ == "__main__":

    data = [
        ['Rob', 'Morn', 240],
        ['Rob', 'Aft',  300],
        ['Joe', 'Morn',  70],
        ['Joe', 'Aft',   80],
        ['Jill', 'Morn', 100],
        ['Jill', 'Aft',  150],
        ['Rob', 'Aft',   40],
        ['Rob', 'aft',    5],
        ['Dozy', 'Aft',   1],
        # Dozy doesn't show up till lunch-time
        ['Nemo', 'never', -1],
        ]
    NAME, TIME, AMOUNT = range(3)
    xlate_time = {'morn': "AM", "aft": "PM"}

    print
    ctab = CrossTab(missing=None, )
    # ctab.dump(header='=== after init ===')
    for s in data:
        ctab.add_item(
            row_key=s[NAME],
            col_key= xlate_time.get(s[TIME].lower(), "XXXX"),
            value=s[AMOUNT])
        # ctab.dump(header='=== after add_item ===')
    print ctab.get_col_headings()
    # ctab.dump(header='=== after get_col_headings ===')
    for x in ctab.generate_row_info():
        print x

输出:

['AM', 'PM', 'XXXX']
('Dozy', [None, 1, None])
('Jill', [100, 150, None])
('Joe', [70, 80, None])
('Nemo', [None, None, -1])
('Rob', [240, 345, None])


 类似资料:
  • 问题内容: 我已经尽力理解如何在SQL中创建数据透视表,但是我无法对其进行管理! 我有以下几列: 拥有60万行数据。 我在下面的数据透视表中需要它们; StartHour作为列标题 作为行标题 作为数据 其中=‘1’作为过滤器。 数据透视表 我设法获得了以下代码,该方法有效,但仅给我date_1作为列标题,而不给我StartHour,或者将filter作为date_source =‘1’。 谢谢你

  • 问题内容: 我在SQL Server中的数据格式如下。 我需要的是能够以以下格式显示数据。 是否有可能做到这一点?我在SQL Server中尝试了数据透视,但是它仅返回一条记录。有人可以帮忙吗? 问题答案: 您可以使用PIVOT函数获取结果,我只需将windowing函数应用于数据,以便可以为每个返回多个行: 请参阅带有演示的SQL Fiddle。 您还可以将聚合函数与CASE表达式一起使用以获取

  • 问题内容: 我找到了一个不错的脚本,该脚本可以为透视表动态按列名创建,但是我没有将分配的值重新返回到表中。这是我的出发桌。 我运行此SQL生成我想要的数据透视表中的列 这给了我以下输出 当我为数据透视表运行动态SQL时 我看到这个结果… 我尝试了几种不同的方法,但是对于这种方法为什么不起作用,我没有提出解决方案。 所需的输出将是ORDER_ID列顺序正确的位置 但这也将对我的应用程序起作用。 问题

  • 问题内容: 我不确定这是否称为“透视”。 我的SQL 2005表 [CustromerRoles]中的数据 是这样的: [角色] 表: 我想创建一个这样的视图: SELECT * FROM [MYVIEW]将为我提供以下数据: 1和0将是位,因此我可以在UI显示屏上显示带有复选框的网格。 到目前为止,我还不知道如何去做。 问题答案: 试试这个: 经过测试。它给出您想要的相同结果。

  • 问题内容: 假设我的数据库表结构是这样的 如果我想根据像这样的sql中的名称获取学生详细信息,请从 name =’xxx’的学生那里选择,以便在redis数据库中如何实现 问题答案: 像其他NoSQL数据存储区一样,Redis根据要执行的操作有不同的要求。 Redis有几种数据结构,根据您的需求可能有用。例如,鉴于您对a的渴望,可以使用Redis 。 如果您还有其他查询,例如您想做同样的事情但选择

  • 问题内容: 我正在使用SQL Server 2008,并且希望将数据转换为: 资料集: 所需结果: 目前,我正在执行以下操作,然后将所需的列粘贴到Excel中: 但是,并非所有匹配的行都不能仅仅并排击打表。对于没有Result的列,我希望显示NULL来填充行以使它们都具有相同数量的记录。 我查了一下PIVOT,但我认为这在这里不起作用…这种数据转换称为什么类型?我不认为这是交叉表… 谢谢! 问题答