样本数据:
|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'))
Query2:
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
答案 0 :(得分: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)工作