sql - 第二个查询中使用的第一个查询的 PostgreSQL 结果
问题描述
样本数据:
|lastmodified|Number1|Number2|password_mod|
|2020-01-25 |250000 |100000 |true |
|2020-01-26 |250000 |200000 |false |
|2020-02-01 |300000 |200000 |false |
|2020-02-10 |350000 |250000 |false |
|2020-02-12 |400000 |250000 |false |
我需要使用以下条件运行查询:
lastmodified within a month AND password_mod = false
Show Number 1 & 2 for all entries
到目前为止,这很容易,但现在是我卡住的部分:
additionally it must show the last Number 1 & 2 that is lower than the current entry
结果应如下所示:
|lastmodified|Number1|Number2|password_mod|Old_Number1|Old_Number2|
|2020-02-01 |300000 |200000 |false |250000 |100000 |
|2020-02-10 |350000 |250000 |false |300000 |200000 |
|2020-02-12 |400000 |250000 |false |350000 |200000 |
我的主要问题是 old_numbers 可能出现在与我的条件不匹配的记录中(一个月内的日期和 password_mod = false)。但这两个标准是强制性的。
我做了两个查询,这两个步骤都完成了。现在我需要一个很好的方法来组合它们。
查询1:
SELECT
a.lastmodifiedat AS Aenderungs_Datum,
a.lastmodifiedby AS Aenderungs_User,
a.ntusername AS Betroffener_User,
a.anweisungshoehekv AS AnweisungshoeheKV,
a.anweisungshoehepflege AS AnweisungshoehePflege
FROM
t_benutzer_aud a
WHERE
(passwort_mod = 'false'
AND (a.lastmodifiedat between '2020-02-01' AND '2020-02-29'))
查询2:
SELECT
b.ntusername AS Betroffener_User,
b.lastmodifiedat AS Aenderungs_Datum,
b.anweisungshoehekv AS AnweisungshoeheKV_alt,
b.anweisungshoehepflege AS Anweisungshoehepflege_alt
FROM
t_benutzer_aud b
WHERE
b.lastmodifiedat < '2020-02-01'
AND
passwort_mod = 'false'
AND b.ntusername = USERNAME from first query
ORDER BY
aenderungs_datum DESC LIMIT 1
解决方案
编写查询的一种直观/用户可读的方式是使用 CTE:
WITH userlist AS (
SELECT
a.lastmodifiedat AS Aenderungs_Datum,
a.lastmodifiedby AS Aenderungs_User,
a.ntusername AS Betroffener_User,
a.anweisungshoehekv AS AnweisungshoeheKV,
a.anweisungshoehepflege AS AnweisungshoehePflege
FROM
t_benutzer_aud a
WHERE
(passwort_mod = 'false'
AND (a.lastmodifiedat between '2020-02-01' AND '2020-02-29'))
) SELECT
b.ntusername AS Betroffener_User,
b.lastmodifiedat AS Aenderungs_Datum,
b.anweisungshoehekv AS AnweisungshoeheKV_alt,
b.anweisungshoehepflege AS Anweisungshoehepflege_alt
FROM
t_benutzer_aud b
WHERE
b.lastmodifiedat < '2020-02-01'
AND passwort_mod = 'false'
AND b.ntusername = userlist.Betroffener_User
ORDER BY aenderungs_datum DESC LIMIT 1;
披露:我为EnterpriseDB (EDB)工作
推荐阅读
- powershell - 带有设置文件的 AzCopy 的 Powershell 脚本
- python - 无法在 Web 服务器上执行 Python 脚本
- javascript - 反应复选框组/单个复选框
- python - Python 会在脚本末尾自动取消设置环境变量吗?
- python - 在 NumPy 数组中查找搜索项的索引
- sql - OPENJSON,解析 JSON 响应
- php - PHP XML 在属性处开始数组,然后是数组切片
- python-3.x - Keras:初始化权重时模型不学习
- group-by - BigQuery - 相当于标准 SQL 中的 GROUP EACH
- docker - 如何在 GCE 和容器镜像上使用持久化存储