Sql 同一个表上的多个联接会增加计数

Sql 同一个表上的多个联接会增加计数,sql,postgresql,join,aggregate,jsonb,Sql,Postgresql,Join,Aggregate,Jsonb,当我在同一个表上运行多个联接时,第一个联接似乎是唯一要经过的联接 例如,我将得到如下结果: 身份证,姓名,200200 身份证,姓名,150,150 身份证,姓名,100100 显然,票数与时间进入计数明显不同 选择 联系,援助, contact.data->>“FirstName”| |“| | contact.data->>“LastName”用户名, 清点门票, 计数时间条目 从缓存联系人 内部联接缓存票据 在ticket.name='ticket'和ticket.data->>'Crea

当我在同一个表上运行多个联接时,第一个联接似乎是唯一要经过的联接

例如,我将得到如下结果:

身份证,姓名,200200 身份证,姓名,150,150 身份证,姓名,100100 显然,票数与时间进入计数明显不同

选择 联系,援助, contact.data->>“FirstName”| |“| | contact.data->>“LastName”用户名, 清点门票, 计数时间条目 从缓存联系人 内部联接缓存票据 在ticket.name='ticket'和ticket.data->>'CreatorResourceID':numeric=contact.aid上 内部连接缓存时间 on time.name='TimeEntry'和time.data->'TicketID'::numeric=ticket.aid 哪里 contact.name='contact' 分组 联系我们, 用户名 订购人 门票说明 ; 我应该得到如下结果:

身份证,姓名,200421 身份证,姓名,150312 身份证,姓名,100152
我猜你是沿着两个不同的维度连接,因此得到了错误的结果

如果是,您可以使用countdistinct。这有点像猜测,但也许:

count(distinct ticket) as tickets,
count(distinct time) as entries

我猜你是沿着两个不同的维度连接,因此得到了错误的结果

如果是,您可以使用countdistinct。这有点像猜测,但也许:

count(distinct ticket) as tickets,
count(distinct time) as entries

你能看看这对你有用吗?这是我在单个表中包含不同相关记录类型时使用的方法

如果第一个case列出现错误,则将数值强制转换更改为可能是int或bigint的任何类型


你能看看这对你有用吗?这是我在单个表中包含不同相关记录类型时使用的方法

如果第一个case列出现错误,则将数值强制转换更改为可能是int或bigint的任何类型


主要问题与此相同:

在您的例子中,在jsonb列中嵌套值会更加模糊,但都是一样的

先聚合,后加入:

选择contact.aid ,concat_ws“”,contact.data->“FirstName”,contact.data->“LastName”作为用户名 ,sumticket.tickets作为票 ,sumticket.entries作为条目 作为联系人从缓存中删除 横向交叉连接 选择计数*::int作为票据 ,sumentry.entries::int作为条目 作为票证从缓存中取出 横向交叉连接 选择count*::int作为条目 从缓存作为条目 其中entry.name='TimeEntry' 和entry.data->>“TicketID”::numeric=ticket.aid 作为条目-原为:时间 其中ticket.name='ticket' 和ticket.data->“CreatorResourceID”::numeric=contact.aid-numeric? 作为票 其中contact.name='contact' 按contact.aid、用户名分组 按票证订购。票证说明; 假设aid或至少aid用户名在基表中是唯一的,我们根本不需要外部聚合:

选择contact.aid ,concat_ws“”,contact.data->“FirstName”,contact.data->“LastName”作为用户名 ,票 ,票务 作为联系人从缓存中删除 横向交叉连接 选择计数*::int作为票据 ,sumentry.entries::int作为条目 作为票证从缓存中取出 横向交叉连接 选择count*::int作为条目 从缓存作为条目 其中entry.name='TimeEntry' 和entry.data->>“TicketID”::numeric=ticket.aid 作为条目-原为:时间 其中ticket.name='ticket' 和ticket.data->“CreatorResourceID”::numeric=contact.aid-numeric? 作为票 其中contact.name='contact' 按票证订购。票证说明; 它不仅避免了成倍计数的主要错误,而且通常使查询速度更快

相关的:

您在原始查询中有内部联接,它可能应该是左联接。。。设置为true以避免删除没有有效条目的用户。在我的解决方案中,将其转换为交叉联接是安全的,因为每个子查询级别都保证只返回一行聚合函数,而不是按分组。见:

关于横向连接:

在子查询中强制转换为integer::int是可选的,并且假设计数永远不会超出整数范围。它避免了升级到数值,这是更昂贵的总结

为什么要喝咖啡?见:

数据->>“TicketID”和数据->>“CreatorResourceID”必须是数字吗?看起来它们应该是整数


旁白:至少在某种程度上规范化您的数据模型可能会有助于您的事业。在jsonb列中嵌套的数据值上连接表的成本相对较高,通常效率更高。

主要问题与此相同:

在您的例子中,在jsonb列中嵌套值会更加模糊,但都是一样的

先聚合,后加入:

选择contact.aid ,concat_ws“”,contact.data->>“FirstName”,contact.data->>“LastNam” e'作为用户名 ,sumticket.tickets作为票 ,sumticket.entries作为条目 作为联系人从缓存中删除 横向交叉连接 选择计数*::int作为票据 ,sumentry.entries::int作为条目 作为票证从缓存中取出 横向交叉连接 选择count*::int作为条目 从缓存作为条目 其中entry.name='TimeEntry' 和entry.data->>“TicketID”::numeric=ticket.aid 作为条目-原为:时间 其中ticket.name='ticket' 和ticket.data->“CreatorResourceID”::numeric=contact.aid-numeric? 作为票 其中contact.name='contact' 按contact.aid、用户名分组 按票证订购。票证说明; 假设aid或至少aid用户名在基表中是唯一的,我们根本不需要外部聚合:

选择contact.aid ,concat_ws“”,contact.data->“FirstName”,contact.data->“LastName”作为用户名 ,票 ,票务 作为联系人从缓存中删除 横向交叉连接 选择计数*::int作为票据 ,sumentry.entries::int作为条目 作为票证从缓存中取出 横向交叉连接 选择count*::int作为条目 从缓存作为条目 其中entry.name='TimeEntry' 和entry.data->>“TicketID”::numeric=ticket.aid 作为条目-原为:时间 其中ticket.name='ticket' 和ticket.data->“CreatorResourceID”::numeric=contact.aid-numeric? 作为票 其中contact.name='contact' 按票证订购。票证说明; 它不仅避免了成倍计数的主要错误,而且通常使查询速度更快

相关的:

您在原始查询中有内部联接,它可能应该是左联接。。。设置为true以避免删除没有有效条目的用户。在我的解决方案中,将其转换为交叉联接是安全的,因为每个子查询级别都保证只返回一行聚合函数,而不是按分组。见:

关于横向连接:

在子查询中强制转换为integer::int是可选的,并且假设计数永远不会超出整数范围。它避免了升级到数值,这是更昂贵的总结

为什么要喝咖啡?见:

数据->>“TicketID”和数据->>“CreatorResourceID”必须是数字吗?看起来它们应该是整数


旁白:至少在某种程度上规范化您的数据模型可能会有助于您的事业。在jsonb列中嵌套的数据值上连接表的成本相对较高,通常效率更高。

请提供示例数据和所需结果。结果在局外人看来很好。DBFIDLE可能会有所帮助。请提供示例数据和所需结果。结果在局外人看来很好。一把小提琴可能会有帮助。我相信这是有效的!我将进行一点测试,并仔细阅读不同的选择。我感谢你的帮助。我相信这是有效的!我将进行一点测试,并仔细阅读不同的选择。我感谢你的帮助,这是无价的指导。我感谢你为我提供这些信息所做的一切努力。我将仔细阅读提供的文档。非常感谢你!这是非常宝贵的指导。我感谢你为我提供这些信息所做的一切努力。我将仔细阅读提供的文档。非常感谢你!非常感谢。我来试试。谢谢!我来试试这个。