www.91084.com

GVKun编程网logo

3表联接与SUM和GROUP BY不起作用(连表group by)

12

在本文中,我们将详细介绍3表联接与SUM和GROUPBY不起作用的各个方面,并为您提供关于连表groupby的相关解答,同时,我们也将为您带来关于AndroidSQLiteORDERBY不起作用、An

在本文中,我们将详细介绍3表联接与SUM和GROUP BY不起作用的各个方面,并为您提供关于连表group by的相关解答,同时,我们也将为您带来关于Android SQLite ORDER BY不起作用、Android ViewGroup剪辑不起作用、cgroup内存限制不起作用的原因、dict(groupby)和groupby之间的区别的有用知识。

本文目录一览:

3表联接与SUM和GROUP BY不起作用(连表group by)

3表联接与SUM和GROUP BY不起作用(连表group by)

我有三个要使用的表。

  1. AccountingLine-保存通用帐户详细信息
  2. 预算-保留每个AccountingLine的预算数据(每个AccountingLine多行)
  3. 实际-保留每个AccountingLine的实际成本数据(每个AccountingLine多行)

我试图在单个查询中获取结果,该查询将从AccountingLine表返回所有行,并从Budget和Actuals表中求和每个AccountingLine的金额。

使用下面的SQL,SUM不适用于预算或实际数据。如果删除联接之一和SUM函数之一,则它将为单个联接表正确计算。非常奇怪…在MySQL的三个或更多表上有人通过多个SUM函数遇到这个问题吗?

SELECT  A.*, SUM(B.`amount`) AS BudgetAmount, SUM(ACT.`amount`) as ActualAmount FROM accounting_line A LEFT JOIN budget B ON B.accounting_line_id = A.accounting_line_idLEFT JOIN actual ACT ON  ACT.accounting_line_id = A.accounting_line_idGROUP BY A.`accounting_line_id`

通过发布上面的声明,我希望看到accounting_line字段,每个accounting_line的预算金额之和和每个accounting_line的实际金额之和。

我到处搜索,找不到多个SUM函数的实例。非常感谢您的任何建议。

乔希

表数据如下:

    Table: AccountingLine      act_line_id   department    ----------------------------------                  1   Sales                   2   HumanResourcesTable: Budget        budget_id   actg_line_id     amount    ----------------------------------------------                  1              1          3500.00                2              2          5000.00                3              2          15000.00Table: Actual        actual_id   actg_line_id     amount    ----------------------------------------------                  1              1        1000.00                2              2         500.00                3              2        9000.00

答案1

小编典典

Ajoin重复另一个表中的每个匹配行。因此,如果在三个表中有3行并将它们连接在一起,则最终将有9行。如果求和,第二张和第三张表的每个和都太高3倍。

一种解决方案是对子查询求和,以使join唯一的查询找到一行:

SELECT   A.*,        B.SumAmount as BudgetAmount,        ACT.SumAmount as ActualAmount FROM     accounting_line A LEFT JOIN         (        select  accounting_line_id        ,       sum(amount) as SumAmount        from    budget        group by                accounting_line_id        ) as BON      B.accounting_line_id = A.accounting_line_idLEFT JOIN         (        select  accounting_line_id        ,       sum(amount) as SumAmount        from    actual        group by                accounting_line_id        ) as ACT ON      ACT.accounting_line_id = A.accounting_line_id

Android SQLite ORDER BY不起作用

Android SQLite ORDER BY不起作用

我有一个非常基本的情况:

我有一个大约5k行的表:

CREATE TABLE "words" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,"name" TEXT NOT NULL,"def" TEXT NOT NULL,"rand" INTEGER)

我使用“UPDATE words SET rand = random()”定期更新

在android中,当我使用rawQuery()使用以下内容创建游标时:

SELECT w.id,w.name,w.def,w.rand FROM words w ORDER BY w.rand ASC;

返回的游标不按正确的顺序迭代.例如.它将按以下顺序输出具有rand值的列:

-1298882092
-2138143484
-1115732861
118839193
...

有谁知道这里发生了什么?这不应该工作吗?如果我在sqliteManager中运行完全相同的查询,它会以正确的顺序返回结果,所以这似乎是特定于android / cursor的.

更新:

这是android中的代码,我尝试了多种方法:

尝试1:

Cursor cursor = db.rawQuery("SELECT w.id,w.rand FROM words w ORDER BY w.rand ASC",new String[]{});

尝试2:

Cursor cursor = db.query("words",new String[]{"id","name","def","rand"},null,"rand ASC");

在这两种情况下,我迭代如下:

while(cursor.movetoNext()) {
    ...
    Log.i("Test",cursor.getInt(3));
    ...
}

解决方法

我解决了它,是一个简单的疏忽. random()函数返回的值可以大于java int数据类型.这产生溢出.切换到getLong(),一切正常.光标一直在正确迭代.

Android ViewGroup剪辑不起作用

Android ViewGroup剪辑不起作用

@H_301_1@
为什么 android:clipChildren =“false”不起作用?我希望实现与CSS溢出相同的效果:可见,这样即使子视图位于父布局之外,它们也是可见的.我尝试过类似的东西,虽然 Eclipse中的图形布局显示了正确的行为,但在手机上它不起作用.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000FF"
android:clipChildren="false"
android:clipToPadding="false" >

<RelativeLayout
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:background="#FF0000"
    android:clipChildren="false"
    android:clipToPadding="false" >

    <RelativeLayout
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="120dp"
        android:background="#00FF00" />
</RelativeLayout>

</RelativeLayout>

解决方法

我现在正在尝试类似的东西,只有当我在所有父母使用booth android:clipChildren =“false”时才会起作用,下一个问题是如果在重叠的孩子下面是像ListView一样重绘自己的东西,那么Android就会忘记重绘我们的孩子和它消失了:-(

唯一的方法是在重叠的孩子之后手动调用.invalidate()在每次重绘视图之后:-(
我还发现,至少小的重叠儿童的和平必须在其父母身上.

另一个问题是在父视图之外的视图中接收触摸/点击事件.我没有找到任何解决方案.

cgroup内存限制不起作用的原因

cgroup内存限制不起作用的原因

今天遇到一个cgroup资源限制时,内存限制不起作用的问题。一开始,对进程的cgroup设置最大内存限制为10M,但运行了几分钟以后,内存明显飙上去了,甚至达到了20多M。

情景还原

memory.limit_in_bytes中设置如下:
image.png
10485760表示的是字节数,也就是等于 1024 * 1024 * 10 = 10M
运行一段时间后,查看实际使用的内存,memory.usage_in_bytes文件中数值如下:
image.png
可以看到,确实拿捏得死死的,看起来似乎内存限制成功了,没有什么问题。
可是当使用top命令去查看的时候,却发现已经内存消耗已高达23M左右,这明显不正常。
image.png
使用前台监控界面查看,得到的是同样的结果:
image.png
可见,虽然设置了cgroup,而且看起来似乎是生效了,但实际上并没有限制住。

问题排查

因为该程序的资源限制是利用agent代理程序去做的,并非人为去操作,所以一开始怀疑该进程没有加入cgroup资源限制策略,查看之后排除了这一可能性。
第一步查到进程PID以及其相应的线程ID,如下所示:
image.png
然后查看tasks里面加入的进程号,如下:
image.png
可以看到,该进程所有的进程和线程号都被加入到了cgroup中。因此,并不是这个引起的。
然后就想到会不会是使用了swap内存,可以看到,8G的swap内存已经被使用了24M,看起来有点像。
image.png
为了验证这一猜想,我把进程先给停掉了,然后查看swap内存使用情况:
image.png
可以看到,flow进程停掉之后,swap内存一下子从24M降到了20K,看样子就是这个东西搞的鬼。
于是我查看了一下memory.swappiness,这个数值居然达到了30,看来是这个问题没跑了。
image.png

问题解决

知道了问题所在,解决也就比较简单了。首先第一步,把memory.swappiness设为0

$ echo 0 >  memory.swappiness

然后重新启动进程,这次成功了,当内存刚刚达到10M,直接就被kill掉了。
但实际上,我并不希望这个进程就如此简单粗暴的被杀掉,考虑到memory.oom_control可以设置内存达到限制后的处理措施,oom_kill_disable0代表内存超过限制就杀掉进程,oom_kill_disable1则代表继续等待,当有内存释放时,继续申请内存。总而言之,就是不会把进程杀掉。
image.png
所以,将oom_kill_disable设置为1后重启程序,该问题得以解决。

总结

cgroupLinux系统内核提供的一种资源限制的策略,使用起来十分方便。鼎鼎大名的Docker容器就是基于此技术,平时工作中对这种技术缺乏钻研和积累,只知道简单的使用,并没有深入研究每个参数到底代表什么,其内部原理又是什么,所以才有了遇到这种问题耗时耗力的情况。
比如memory.swappiness中从数值代表什么意思,为啥设置为0之后cgroup就起作用了?原来的30又代表什么?
通过查资料后,了解到memory.swappiness中的数值其实并不是确切的数值,而是代表了进程使用swap空间的一个权重,该数值范围从0-100100表示积极使用swap0表示优先使用内存。

参考资料:docker cgroup 技术之memory(首篇)

dict(groupby)和groupby之间的区别

dict(groupby)和groupby之间的区别

我有这样的清单

[u''201003'', u''200403'', u''200803'', u''200503'', u''201303'', u''200903'', u''200603'', u''201203'', u''200303'', u''200703'', u''201103'']

让我们将此列表称为“ years_list”

当我按年分组时

group_by_yrs_list = groupby(years_list, key = lambda year_month: year_month[:-2]) for k,v in group_by_yrs_list:  print k, list(v)

我得到了期望的输出:

2010 [u''201003'']2004 [u''200403'']2008 [u''200803'']2005 [u''200503'']2013 [u''201303'']2009 [u''200903'']2006 [u''200603'']2012 [u''201203'']2003 [u''200303'']2007 [u''200703'']2011 [u''201103'']

然后,我像这样稍微更改了实现,

  group_by_yrs_list = dict(groupby(years_list, key = lambda year_month: year_month[:-2]))  for k,v in group_by_yrs_list.items():    print k, list(v)

我刚刚添加了一个字典,但是输出是不同的,

2003 []2006 []2007 []2004 []2005 []2008 []2009 []2011 [u''201103'']2010 []2013 []2012 []

我不知道为什么。请帮助我找到字典的实际作用。

(Python 2.7)

答案1

小编典典

groupby产生(key,
iterator -of-group)对。如果要迭代第二对,则第一对的组迭代器已被消耗,因此您将获得空列表。

尝试以下代码:

group_by_yrs_list = {year:list(grp) for year, grp in groupby(years_list, key=lambda year_month: year_month[:-2])}for k, v in group_by_yrs_list.items():    print k, v

关于3表联接与SUM和GROUP BY不起作用连表group by的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android SQLite ORDER BY不起作用、Android ViewGroup剪辑不起作用、cgroup内存限制不起作用的原因、dict(groupby)和groupby之间的区别的相关知识,请在本站寻找。

本文标签: