【问题标题】:Retrieve start and last created date from a duplicated record从重复记录中检索开始日期和最后创建日期
【发布时间】:2019-10-04 15:57:33
【问题描述】:

我有一个名为 mov_entrys 的表,它们有多个历史记录,换句话说,重复记录这是我的主要 SQL 语句

SELECT me.mov_entry_id, me.mov_entry_ean13, me.plate, mv.name vehiclename,
                ma.name areaname, ml.name locationame, me.value, mov_pay.name paytype ,me.validated, me_usu.name operatorName,
                to_char(me.created_at, 'DD/MM/YYYY HH24:MI:SS') created_at, 
                to_char(me.updated_at, 'DD/MM/YYYY HH24:MI:SS') updated_at
                FROM mov_entrys me
                LEFT OUTER JOIN mov_payment_type mov_pay on mov_pay.mov_payment_type_id = me.mov_payment_type_id
                JOIN mov_vehicles mv ON me.mov_vehicle_id = mv.mov_vehicle_id            
                JOIN mov_areas ma ON me.mov_area_id = ma.mov_area_id        
                JOIN mov_locations ml ON ma.mov_location_id = ml.mov_location_id
                JOIN mov_users me_usu ON me.mov_user_id = me_usu.mov_user_id
                WHERE me.value > 0
                AND me.validated <> 'O'
                AND me.validated <> 'V'
                AND me.validated <> 'I'
                AND me.created_at >= date_trunc('month', NOW()) - '1 month'::interval
                order by mov_entry_id desc

但是记录是这样的例子:

id ean13         value validated created_at            updated_at
1  7800003378198 0     N         2019-10-04 09:00:31   2019-10-04 09:00:31
2  7800003378198 8     S         2019-10-04 13:01:11   2019-10-04 13:01:11
3  7800003378198 10.5  AD        2019-10-04 13:02:13   2019-10-04 13:02:13
3  7800003378198 10.5  I         2019-10-04 13:05:13   2019-10-04 13:05:13

在 Laravel 中,创建数据时 created_at 和 updated_at 是相同的数据,但我希望这条记录的开始日期和最后日期具有相同的 ean13 数据 7800003378198

主查询返回我想要的记录,但数据相同,我想要真实创建的数据和最后的数据

如果你认为记录在顶部,我想要这样的回报,如果我使用组我不能这样

id ean13         value validated created_at            updated_at
2  7800003378198 8     S         2019-10-04 09:00:31   2019-10-04 13:05:13
3  7800003378198 10.5  AD        2019-10-04 09:00:31   2019-10-04 13:05:13 

我尝试进行子查询,但我不知道为什么总是进行无限加载以返回数据我认为我做错了什么,这是我的子查询查询

SELECT me.mov_entry_id, me.mov_entry_ean13, me.plate, mv.name vehiclename,
                ma.name areaname, ml.name locationame, me.value, mov_pay.name paytype ,me.validated, me_usu.name operatorName,
                to_char(me.created_at, 'DD/MM/YYYY HH24:MI:SS') created_at, 
                to_char(me.updated_at, 'DD/MM/YYYY HH24:MI:SS') updated_at,             
                (               
                    SELECT me_v2.created_at FROM mov_entrys me_v2 WHERE me.mov_entry_ean13 = me_v2.mov_entry_ean13
                    ORDER BY me_v2.created_at DESC
                    LIMIT 1                 
                ) date_test             
                FROM mov_entrys me
                LEFT OUTER JOIN mov_payment_type mov_pay on mov_pay.mov_payment_type_id = me.mov_payment_type_id
                JOIN mov_vehicles mv ON me.mov_vehicle_id = mv.mov_vehicle_id            
                JOIN mov_areas ma ON me.mov_area_id = ma.mov_area_id        
                JOIN mov_locations ml ON ma.mov_location_id = ml.mov_location_id
                JOIN mov_users me_usu ON me.mov_user_id = me_usu.mov_user_id
                WHERE me.value > 0
                AND me.validated <> 'O'
                AND me.validated <> 'V'
                AND me.validated <> 'I'
                AND me.created_at >= date_trunc('month', NOW()) - '1 month'::interval
                order by mov_entry_id desc

当我单独执行此查询时,它可以正常工作,给我最后一条记录, 我做错了什么?这是我的测试查询:

SELECT me.created_at FROM mov_entrys me WHERE me.mov_entry_ean13 = '7800003378198'
                ORDER BY me.created_at DESC
                LIMIT 1

我的魔法

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    考虑使用MINMAX 聚合日期,并按所有其他SELECT 列分组。下面使用较短的别名来提高可读性:

    SELECT e.mov_entry_id, e.mov_entry_ean13, e.plate, v.name AS vehiclename,
           a.name AS areaname, l.name AS locationame, e.value, p.name AS paytype, 
           e.validated, u.name AS operatorName,
           to_char(MIN(e.created_at), 'DD/MM/YYYY HH24:MI:SS') AS created_at, 
           to_char(MAX(e.updated_at), 'DD/MM/YYYY HH24:MI:SS') AS updated_at
    FROM mov_entrys e
    LEFT OUTER JOIN mov_payment_type p ON p.mov_payment_type_id = e.mov_payment_type_id
    INNER JOIN mov_vehicles v ON e.mov_vehicle_id = v.mov_vehicle_id            
    INNER JOIN mov_areas a ON e.mov_area_id = a.mov_area_id        
    INNER JOIN mov_locations l ON a.mov_location_id = l.mov_location_id
    INNER JOIN mov_users u ON e.mov_user_id = u.mov_user_id
    WHERE e.value > 0
      AND e.validated <> 'O'
      AND e.validated <> 'V'
      AND e.validated <> 'I'
      AND e.created_at >= date_trunc('month', NOW()) - '1 month'::interval
    GROUP BY e.mov_entry_id, e.mov_entry_ean13, e.plate, v.name,
             a.name,l.name, e.value, p.name, e.validated, u.name
    ORDER BY e.mov_entry_id desc
    

    【讨论】:

    • 我不能分组,因为我不想只注册一个,我更新我的问题看看,我用粗体显示我的文字
    • 这个聚合查询中有 10 个分组,其中包括 valuevalidated(不仅仅是一个字段)。为什么在您的示例中从三行中删除一行的逻辑是什么?另外,WHERE 子句中有me.validated &lt;&gt; 'I',那么I 记录如何返回?你有me.value &gt; 0,所以第一行会被过滤掉。请提供实际的需求逻辑,而不仅仅是数据。
    • 总的来说,您需要某种聚合,因为您想保留多个字段中的记录,但更改日期值似乎是@ 987654329@ 和 MAX 值。
    • 我提出我的问题,再看你就会明白。每个条目都有两个统计数据,我想在我的报告中显示验证 S 和 AD,当这个相同的条目 7800003378198 时,我想显示这个 7800003378198 的最大日期和最小日期,你现在明白了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多