我有一个包含多个user
记录的DB2数据库,这些记录通过几个中间表与newsletter
记录相关。
我的问题是我需要只是他们收到的最新newsletter
用户在上周。几个小时以来,我一直在敲打着我的脑袋,仍然没有找到一种方法来干净地获得我需要的记录。我认为这将是解决方案,但我一直遇到非常一般的错误,我不太了解原因。
SELECT a.*, d.tech_id as newsletter FROM users a
JOIN user_profile b ON b.tech_id = a.profile_id
JOIN user_contact c ON c.user_id = b.tech_id
JOIN (
SELECT newsletters.tech_id, ROW_NUMBER() OVER (ORDER BY timestamp(tech_id) DESC) AS RN
FROM NEWSLETTERS
) d ON d.tech_id = c.newsletter_id
WHERE (timestamp(d.rn) < current_timestamp - 7 days)
有更好的方法可以做到这一点,还是我错过了一个明显的问题?
编辑:
这就是我想要做的事情,虽然它也不能正常工作:
SELECT a.* as newsletter FROM users a
WHERE (
SELECT MAX(timestamp(newsletters.tech_id))
FROM newsletters
WHERE newsletters.tech_id IN(
SELECT newsletter_id FROM user_contact WHERE user_contact.profile_id = a.tech_id
)
) < current_timestamp - 7 days
结构非常简单。 users
表的外键为profile_id
,其键入user_profile.tech_id
。 user_contact.user_id
字段是user_profile.tech_id
的关键字。 user_contact
表有一个名为user_contact.newsletter_id
的外键,键入newsletters.tech_id
答案 0 :(得分:0)
RN
是根据列的最新时间戳生成的行号。不应将其与最终where
子句中的日期进行比较。但是,在row_number
函数中,如果timestamp(tech_id)
不是tech_id
数据类型,那么您按datetime
排序将无法按预期工作。
根据您的要求,不需要row_number
。
尝试以下查询。
SELECT a.*, d.tech_id as newsletter
FROM users a
JOIN user_profile b ON b.tech_id = a.profile_id
JOIN user_contact c ON c.user_id = b.tech_id
JOIN NEWSLETTERS d ON d.tech_id = c.newsletter_id
WHERE (timestamp(d.datecolumn) < current_timestamp - 7 days)
--change the d.datecolumn to the datetime column in the table
答案 1 :(得分:0)
您似乎需要使用GROUP BY
。尝试这样的事情:
SELECT a.*
FROM users a
JOIN (
SELECT d.tech_id as newsletter, MAX(d.datecol)
FROM user_profile b
JOIN user_contact c ON c.user_id = b.tech_id
JOIN NEWSLETTERS d ON d.tech_id = c.newsletter_id
WHERE (timestamp(d.datecol) < current_timestamp - 7 days)
GROUP BY d.tech_id
) e ON e.tech_id = a.profile_id