- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 PostgreSQL 9.4.4 中有复杂的 SQL 查询:
SELECT
p.id,
p.name,
p.page_variant_id,
p.variant_name,
(
SELECT COUNT(*) FROM page_views
INNER JOIN unique_page_visits upv ON upv.id = page_views.unique_page_visit_id
WHERE page_views.page_id = p.id AND upv.updated_at >= '2015-08-15' AND
upv.updated_at <= '2015-08-22'
) as views_count,
(
SELECT COUNT(*) FROM unique_page_visits upv
WHERE upv.page_id = p.id AND upv.updated_at >= '2015-08-15' AND
upv.updated_at <= '2015-08-22'
) as page_visits_count,
(
SELECT COUNT(*) FROM conversions
INNER JOIN conversion_goals cg ON cg.id = conversions.conversion_goal_id
INNER JOIN unique_page_visits upv ON upv.id = conversions.unique_page_visit_id
WHERE cg.page_id = p.id AND conversions.updated_at >= '2015-08-15' AND
conversions.updated_at <= '2015-08-22' AND cg.name = 'popup'
) as conversions_count
FROM
pages p
WHERE
p.page_variant_id = '25'
ORDER BY
p.id ASC
示例结果:
id | name | page_variant_id | variant_name | views_count | page_visits_count | conversions_count
----+------+-----------------+--------------+-------------+-------------------+-------------------
73 | a | 25 | Original | 1 | 1 | 1
(1 row)
我不知道这个查询是否以最好的方式编写,但它有效。
欢迎任何改进! - 删除 SELECT 子查询中的冗余,例如:
AND upv.updated_at >= '2015-08-15' AND upv.updated_at <= '2015-08-22'
问题 是我必须按天对结果进行分组。每一天都必须出现在结果中,即使那天没有找到任何行。
我可以重复使用 this code (我稍微修改了一下;归功于 Erwin Brandstetter):
SELECT *
FROM (SELECT generate_series('2015-08-15'::date
, '2015-08-22'::date
, '1 day'::interval)::date) AS d(day)
LEFT JOIN (
SELECT date_trunc('month', date_col)::date AS day
, count(*) AS some_count
FROM tbl
WHERE date_col >= '2007-12-01'::date
AND date_col <= '2008-12-06'::date
-- AND ... more conditions
GROUP BY 1
) t USING (day)
ORDER BY 1;
主要问题是我需要在created_at
字段上LEFT JOIN
(转换为date
) 到表 page_views
、conversions
和 unique_page_visits
,而不是 pages
表(主查询,不是子查询-在SELECT
区域查询)。
伪代码:
SELECT *
FROM
(SELECT generate_series('2015-08-15'::date
, '2015-08-22'::date
, '1 day'::interval)::date) AS d(day)
LEFT JOIN (
SELECT day_from_subquery_not_from_pages::data AS day
-- other stuff to return proper results AND conditions
) t USING(day)
这可能吗?
或者我可能不得不将这个大型查询拆分为子查询(然后我将有 3 个...),然后使用 UNION
连接结果?然后我可以从子查询中 JOIN ON
days ...
实现此目标的最佳方法是什么?
最佳答案
猜测缺少的详细信息,此查询可能是您要查找的内容:
WITH p AS (
SELECT '2015-08-15'::date AS a, '2015-08-22'::date AS z -- enter bounds once
, id, name, page_variant_id, variant_name
FROM pages
WHERE page_variant_id = '25' -- enter ID once
)
SELECT p.id, p.name, p.page_variant_id, p.variant_name
, day, v.views_count, pv.page_visits_count, c.conversions_count
FROM p
, LATERAL (SELECT day::date FROM generate_series(p.a, p.z, interval '1 day') day) d
LEFT JOIN (
SELECT upv.updated_at::date AS day, count(*) AS views_count
FROM p
JOIN page_views pv ON pv.page_id = p.id
JOIN unique_page_visits upv ON upv.id = pv.unique_page_visit_id
WHERE upv.updated_at BETWEEN p.a AND p.z
GROUP BY 1
) v USING (day)
LEFT JOIN (
SELECT upv.updated_at::date AS day, count(*) AS page_visits_count
FROM p
JOIN unique_page_visits upv ON upv.page_id = p.id
WHERE upv.updated_at BETWEEN p.a AND p.z
GROUP BY 1
) pv USING (day)
LEFT JOIN (
SELECT upv.updated_at::date AS day, count(*) AS conversions_count
FROM p
JOIN conversion_goals cg ON cg.page_id = p.id
JOIN conversions c ON c.conversion_goal_id = cg.id
JOIN unique_page_visits upv ON upv.id = c.unique_page_visit_id
WHERE cg.name = 'popup'
AND c.updated_at BETWEEN p.a AND p.z
GROUP BY 1
) c USING (day)
ORDER BY day;
关于sql - 按天分组,在left join中显示没有数据和复杂查询的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32129872/
IE 似乎在来自未压缩的 raphaeljs 1.4.7 的以下第 2207 行(当然,在我的代码的上下文中): gs.left != (t = left + "px") && (gs.left =
这是在操纵 $("#mydiv").position().left 还是 $("#mydiv").offset().left? $("#mydiv").animate({"left":"-100"},
这个问题在这里已经有了答案: why left+(right-left)/2 will not overflow? (7 个答案) 关闭 1 年前。 在二分搜索 while 循环中: left, r
这个问题在这里已经有了答案: why left+(right-left)/2 will not overflow? (7 个答案) 关闭 1 年前。 在二分搜索 while 循环中: left, r
我有一个 Segment 类和一个这样的段数组: private static class Segment { int number, type; Segment(in
我有一个查询,它在子选择上执行 LEFT JOIN。此查询在高负载环境中运行,并在设定的要求内执行。查询(高度简化)如下所示: SELECT table_A.pKey , table_A.uKey
我在 SO 中看到一些创建 multilanguage websites in JavaScript 的好建议包括 this article on JavaScript internationaliz
我已经使用它年了,所以是时候全面了解它了。假设这样的查询: SELECT * FROM a LEFT JOIN b ON foo... LEFT JOIN c ON bar... document
我正在尝试对搜索框执行以下 MySql 查询。我试图返回“专辑”信息(标题等),同时包含该专辑中第一张图片的缩略图。但是,我必须查找两个表才能获取图像信息。首先,photos_albums包含该相册中
我有 2 个表,我想 LEFT JOIN 并过滤 LEFT 表上的结果。这些表是: -product_table,包含列 id 和 product_name -order_table,包含列 id、p
我理解 Left Join 应该做什么吗? 我有一个问题。将其称为查询 A。它返回 19 条记录。 我有另一个查询,查询 B。它返回 1,400 条记录。 我将查询 B 作为左连接插入到查询 A 中,
我正在使用 left: auto;希望重写left: 0;但它不起作用(请参阅 jsfiddle )-我想要 居中对齐。 HTML:
为什么这不起作用?我已经分配了一堆带有 float:left 的 div,并希望设置第一个元素的位置,然后用它更新所有 sibling 的位置。 例如,我将第一个元素的 css 设置为 left:50
这应该是非常基本的 CSS,但无论我尝试什么,该死的 div 就是不会去它应该去的地方! 这是 HTML: Registe-se Nome:
我在一个 div 中嵌套了一个 div。我正在尝试显示一些文本并且有效。然而,我想要的是文本居中对齐,即它有一个 left: -50%。但它什么都不做。但是当我执行类似 left: 20px 的操作时
我有一个包含跟踪数据的表格。在其他值中,该表具有列 traffic_medium、traffic_source 和 traffic_campaign。这些列有时确实包含 (none) 或 null 作
我正在尝试 中的代码。 在 GHC 版本 6.10.4 上: data ParseState = ParseState { string :: String } deriving (Show) n
我在使用用于显示自定义配置文件字段和任何(可选)对应值的 SQL 查询时遇到问题。 这是我正在使用的 SQL 查询: SELECT pf.`id`, pf.`name`, pv.`value` FRO
我目前制作了一个包含侧边栏和内容的容器,但是当我向侧边栏添加的文本多于向容器添加的文本时,第二个侧边栏会稍微 float 到一边。这些是我正在使用的代码。 HTML: Pl
这个问题在这里已经有了答案: Difference between margin and padding? (25 个答案) 关闭 5 年前。
我是一名优秀的程序员,十分优秀!