sql - 使用 PostgreSQL 的 CTE 按时间戳过滤不起作用
问题描述
我每个都有多个价格locl_ntwrk_id
。
我想要完成的是只选择一个价格gateway.pricings.charges.t_valid <= CURRENT_TIMESTAMP(6)
。
但是我目前无法得到任何东西。
表 locales.countries:
+--------------+--------------+
|locl_ctry_id |icc |
+--------------+--------------+
|218 |387 |
|219 |385 |
|220 |381 |
|297 |382 |
+--------------+--------------+
表 locales.networks:
+--------------+--------------+
|locl_ntwrk_id |locl_ctry_id |
+--------------+--------------+
|21890 |218 |
|21805 |218 |
|21803 |218 |
|21910 |219 |
|21902 |219 |
|21901 |219 |
|21912 |219 |
+--------------+--------------+
和表定价。收费:
+--------------+---------------------------+--------------+--------------+
|locl_ntwrk_id |t_valid |locl_ccy_id |cost |
+--------------+---------------------------+--------------+--------------+
|21890 |2017-02-06 00:00:00.000000 |978 |1.0 |
|21890 |2019-04-01 00:00:00.000000 |978 |2.0 |
|21805 |2019-04-01 00:00:00.000000 |978 |2.0 |
|21805 |2017-02-06 00:00:00.000000 |978 |1.0 |
|21803 |2017-02-06 00:00:00.000000 |978 |1.0 |
+--------------+---------------------------+--------------+--------------+
我的 SQL:
WITH cte_pricings AS (
SELECT
gateway.pricings.charges.locl_ntwrk_id,
gateway.pricings.charges.t_valid,
gateway.pricings.charges.locl_ccy_id,
gateway.pricings.charges.cost
FROM gateway.pricings.charges
WHERE gateway.pricings.charges.t_valid <= CURRENT_TIMESTAMP(6)
)
SELECT
gateway.locales.countries.locl_ctry_id,
gateway.locales.countries.icc,
gateway.locales.networks.locl_ntwrk_id,
gateway.locales.networks.locl_ctry_id
FROM gateway.locales.countries
LEFT JOIN gateway.locales.networks USING (locl_ctry_id)
LEFT JOIN cte_pricings USING (locl_ntwrk_id);
WHERE left(gateway.locales.countries.icc::text, 2) IN ('38')
如果CURRENT_TIMESTAMP
是 2019-04-02 的预期结果:
+--------------+--------------+--------------+---------------------------+--------------+--------------+
|locl_ctry_id |icc |locl_ntwrk_id |t_valid |locl_ccy_id |cost |
+--------------+--------------+--------------+---------------------------+--------------+--------------+
|218 |387 |21890 |2019-04-01 00:00:00.000000 |978 |2.0 |
|218 |387 |21805 |2019-04-01 00:00:00.000000 |978 |2.0 |
|218 |387 |21803 |2017-02-06 00:00:00.000000 |978 |1.0 |
+--------------+--------------+--------------+---------------------------+--------------+--------------+
如果CURRENT_TIMESTAMP
是 2019-03-20 的预期结果:
+--------------+--------------+--------------+---------------------------+--------------+--------------+
|locl_ctry_id |icc |locl_ntwrk_id |t_valid |locl_ccy_id |cost |
+--------------+--------------+--------------+---------------------------+--------------+--------------+
|218 |387 |21890 |2017-02-06 00:00:00.000000 |978 |1.0 |
|218 |387 |21805 |2017-02-06 00:00:00.000000 |978 |1.0 |
|218 |387 |21803 |2017-02-06 00:00:00.000000 |978 |1.0 |
+--------------+--------------+--------------+---------------------------+--------------+--------------+
解决方案
如果我理解正确,您可以使用distinct on
:
SELECT DISTINCT ON (locl_ctry_id, icc, locl_ntwrk_id) . . .
FROM gateway.locales.countries c JOIN
gateway.locales.networks
USING (locl_ctry_id) JOIN
gateway.pricings.charges ch
USING (locl_ntwrk_id)
WHERE ch.t_valid <= CURRENT_TIMESTAMP(6)
ORDER BY locl_ctry_id, icc, locl_ntwrk_id, ch.t_valid DESC
推荐阅读
- c# - nameOf 运算符和 nameOf 表达式
- azure-active-directory - MSAL - userIdentifier 与 idToken.oid
- mysql - MySQL从B列存在的表中选择不同的A列,或者如果B列没有,则根据C列最新
- reactjs - redux 中间件的问题 - 错误:操作必须是普通对象。使用自定义中间件进行异步操作
- python - 创建带有特定标签的条形图
- r - 如何在 R 中做 sumif/countif 公式?
- java - 使用 Maven 的命名约定在 Gradle 中进行集成测试?
- python - 熊猫在子字符串中找到完美匹配
- javascript - 如何修复 JS 和 Jquery 不适用于 chrome 扩展
- javascript - 如何在没有 ORM 的 nodejs 中使用 postgresql 创建表?