我知道我可能需要进行分组才能完成此任务,但我不太了解。PostgreSQL 8.1
我需要将结果集限制为“原始> 2017-01-01”。原始设置在第11行中。它在Excel中作为一列返回,是一个日期。
目前,它返回的结果可以追溯到几年前的数据,而我们并不需要它。
select distribution_stop_information.customer_no,
distribution_line_items.item_number,
distribution_line_items.container_id,
distribution_line_items.item_description,
distribution_stop_information.customer_reference,
distribution_stop_information.bol_number, SUBSTRING(distribution_stop_information.bol_number,1,4) as ODDC,
SUBSTRING(distribution_stop_information.bol_number,9,4) as ODRT,
distribution_stop_information.branch_id,
distribution_stop_information.route_date,
(select count(innerDLI.item_number)-1 from distribution_line_items innerDLI where innerDLI.item_number = distribution_line_items.item_number) as RDLcount,
(select innerDLI.datetime_created from distribution_line_items innerDLI where innerDLI.item_number = distribution_line_items.item_number order by innerDLI.datetime_created asc limit 1) as Origination,
distribution_stop_information.route_code,
distribution_stop_information.stop_name,
distribution_stop_information.stop_address,
distribution_stop_information.stop_city,
distribution_stop_information.stop_state,
distribution_stop_information.stop_zip_postal_code,
distribution_stop_information.stop_signature,
CASE WHEN distribution_line_items.exception_code is not null
THEN distribution_line_items.exception_code
ELSE distribution_stop_information.stop_exception_code
END as ExceptionCode,
distribution_stop_information.signature_file_name,
distribution_stop_information.sign_bitmap_file_exists,
ScanR.item_was_scanned as ScanR,
ScanL.item_was_scanned as ScanL,
ScanD.item_was_scanned as ScanD
from distribution_stop_information
inner join distribution_line_items on distribution_line_items.unique_id_no = distribution_stop_information.unique_id_no
left join distribution_item_scans ScanR on
ScanR.item_sequence_no = distribution_line_items.item_sequence_no
and ScanR.stop_unique_id_no = distribution_stop_information.unique_id_no and ScanR.scan_type = 1
left join distribution_item_scans ScanL on
ScanL.item_sequence_no = distribution_line_items.item_sequence_no
and ScanL.stop_unique_id_no = distribution_stop_information.unique_id_no and ScanL.scan_type = 2
and ScanL.scan_datetime between to_date(?, 'YYYY-MM-DD') and ( to_date(?, 'YYYY-MM-DD') + interval '1 day' )
left join distribution_item_scans ScanD on
ScanD.item_sequence_no = distribution_line_items.item_sequence_no
and ScanD.stop_unique_id_no = distribution_stop_information.unique_id_no and ScanD.scan_type = 9
and ScanD.scan_datetime between to_date(?, 'YYYY-MM-DD') and ( to_date(?, 'YYYY-MM-DD') + interval '1 day' )
where
distribution_stop_information.customer_no in ( '90202' )
and distribution_stop_information.route_date between ( to_date(?, 'YYYY-MM-DD') ) and ( to_date(?, 'YYYY-MM-DD') )
and distribution_line_items.datetime_created between ( to_date(?, 'YYYY-MM-DD') - interval '288 hours' ) and ( to_date(?, 'YYYY-MM-DD') + interval '12 hours' )
更新:我已将选择内容更改为这样,它似乎正在工作-是否对这样做是否正确有任何想法?它只会一直盯着过去的180天。
(select innerDLI.datetime_created from distribution_line_items innerDLI where innerDLI.item_number = distribution_line_items.item_number and innerDLI.datetime_created > to_date(?, 'YYYY-MM-DD') - interval '180 days' order by innerDLI.datetime_created asc limit 1) as Origination,
这是您的操作方式-列名中的别名
select
-- etc etc
(select innerDLI.datetime_created from distribution_line_items innerDLI where innerDLI.item_number = distribution_line_items.item_number order by innerDLI.datetime_created asc limit 1) as Origination,
-- etc etc
from distribution_stop_information
-- etc etc
这是将它放在where别名中的方式
select
-- etc etc
Origination.datetime_created
-- etc etc
from distribution_stop_information
left join distribution_line_items AS Origination ON Origination.item_number = distribution_line_items.item_number
where Origination.datetime_created > to_date(?, 'YYYY-MM-DD') - interval '180 days'
-- etc etc
没有什么比您发布的解决方案 更好 (sql优化器应该产生相同的计划),但是它是“在where子句中使用别名”
问题内容: 我有这样的查询: 出现以下错误: 在MySql中,这是有效的,但显然在Postgresql中是无效的。据我所知,原因是查询部分的评估晚于该部分。是否有解决此问题的常用解决方法? 问题答案: 正如您所经历的那样,MySQL的支持是非标准的。正确的方法是重新打印SELECT子句中使用的相同表达式:
问题内容: 在理解查询别名在Postgresql中的工作方式时有些麻烦。我有以下几点: 我可以使用as命令重命名“ count1”列,但似乎无法在查询中再次引用它吗?我试图在此查询的末尾包含一个HAVING命令,以仅查询计数少于最大值的一半的对象。 这是家庭作业,但我不是在寻求答案,而是一个指向如何在另一个子句中包含count1列的指针。 有人可以帮忙吗? 问题答案: 通常,您不能在查询的后面引用
问题内容: 我懂了 “无效的列名daysdiff”。 Maxlogtm是日期时间字段。是让我发疯的小东西。 问题答案: 通常,您不能在子句中引用字段别名。(将其视为包括别名在内的全部内容,在该子句之后应用。) 但是,如其他答案所述,您可以强制将SQL视为在子句之前进行处理。通常使用圆括号来强制操作的逻辑顺序,或者使用通用表表达式(CTE)来完成此操作: 括号/子选择: 或参阅亚当的CTE版本答案。
问题内容: 我知道在oracle / mysql / sqlserver语句中,您不能在子句中引用列别名,因为它是在之前执行的,但它在sqlite3中有效: 为什么在sqlite中这有可能? 问题答案: 使用启用了标志的sqlite3 : 从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行and命令。 因此,要回答我自己的问题,sqlite引擎能够通过在
问题内容: 我正在执行以下查询,并为所有列使用别名。我用命名了别名。因为这是必需的。现在,我想直接在where子句中引用别名,我的操作如下所示: 但是,当我执行此操作时,出现以下错误: 我知道SQL首先执行where子句,因此这就是错误的原因。但是我该如何解决呢?有什么建议吗? 问题答案: 您已经知道不能在子句中使用别名,但这仅适用于相同级别的SQL。您可以将查询包装在外部查询中: 唯一的选择是重
问题内容: 我在mysql中的“ where in”子句中遇到问题,我无法弄清楚出了什么问题。所以我有两张桌子… 1)座位 (int)seat_id 2)寄存器 (int)register_id (varchar)seat_ids-以逗号分隔的席位,例如102,103,104 因此,我要获取匹配结果的查询是 有人可以找出问题所在吗?谢谢, 问题答案: 要求列表是文字列表,而不是逗号分隔的字符串。用