我有下表(我無法更改)
| ID | 姓名 | 日期 | 可用的 |
|---|---|---|---|
| 1 | Book_1 | 2019-10-11 | 是 |
| 2 | Book_1 | 2019-10-12 | 是 |
| 3 | Book_1 | 2019-10-13 | 是 |
| 4 | Book_1 | 2019-10-14 | 是 |
| 5 | Book_2 | 2019-10-11 | 是 |
| 6 | Book_2 | 2019-10-12 | 是 |
| 7 | Book_2 | 2019-10-13 | 是 |
| 8 | Book_3 | 2019-10-11 | 是 |
| 9 | Book_3 | 2019-10-12 | ? |
| 10 | Book_3 | 2019-10-13 | 是 |
用戶想搜索2019-10-11到2019-10-13可以借的書,需要回傳下表
| ID | 姓名 | 日期 | 可用的 |
|---|---|---|---|
| 1 | Book_1 | 2019-10-11 | 是 |
| 2 | Book_1 | 2019-10-12 | 是 |
| 3 | Book_1 | 2019-10-13 | 是 |
| 5 | Book_2 | 2019-10-11 | 是 |
| 6 | Book_2 | 2019-10-12 | 是 |
| 7 | Book_2 | 2019-10-13 | 是 |
請注意,Book_3 在 2019 年 10 月 12 日不可用,所以我不能退貨。可以用 SQL 嗎?
uj5u.com熱心網友回復:
您可以使用子查詢 withBOOL_AND來檢查available是否適用于一本書true的所有s:date
SELECT *
FROM books
WHERE date BETWEEN '2019-10-11' AND '2019-10-13'
AND name IN (
SELECT name
FROM books
WHERE date BETWEEN '2019-10-11' AND '2019-10-13'
GROUP BY name
HAVING BOOL_AND(available) -- or BOOL_AND(available = 'Y') if the column is not a BOOLEAN
);
| ID | 姓名 | 日期 | 可用的 |
|---|---|---|---|
| 1 | Book_1 | 2019-10-11T00:00:00.000Z | 真的 |
| 2 | Book_1 | 2019-10-12T00:00:00.000Z | 真的 |
| 3 | Book_1 | 2019-10-13T00:00:00.000Z | 真的 |
| 5 | Book_2 | 2019-10-11T00:00:00.000Z | 真的 |
| 6 | Book_2 | 2019-10-12T00:00:00.000Z | 真的 |
| 7 | Book_2 | 2019-10-13T00:00:00.000Z | 真的 |
在 DB Fiddle 上查看
uj5u.com熱心網友回復:
您可以嘗試在子查詢中使用聚合視窗函式
SELECT *
FROM (
SELECT *,
MAX(CASE WHEN available = 'N' THEN 1 END)
OVER(PARTITION BY name) is_available
FROM T
) t1
WHERE is_available IS NULL AND
date BETWEEN '2019-10-11' AND '2019-10-13'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457839.html
標籤:sql PostgreSQL
上一篇:多列上的BigQuery轉置
下一篇:獲取當前周/月日期
