考慮下表:
| 列_A | 列_B | 列_C |
|---|---|---|
| 1 | 用戶A | 空值 |
| 2 | 用戶B | 空值 |
| 3 | 用戶C | 1 |
| 4 | 用戶A | 1 |
| 5 | 用戶B | 空值 |
| 6 | 用戶B | 2 |
| 7 | 用戶C | 2 |
我想回傳所有行(Column_A、Column_B、Column_C),以便:
- Column_C 為 NULL,或
- 對于 Column_C 中的每個唯一值,回傳具有 Column_B == UserA 的第一行。如果不存在這樣的行,則回傳按 Column_B.time_created 排序的第一行。
| 列_A | Column_B (FK) | 列_C |
|---|---|---|
| 1 | 用戶A | 空值 |
| 2 | 用戶B | 空值 |
| 4 | 用戶A | 1 |
| 5 | 用戶B | 空值 |
| 6 | 用戶B | 2 |
不確定如何在單個查詢中執行此操作。
select Column_A, Column_B, Column_C, min(case when Column_B=UserA then 0 else 1 end) as custom_order from Table where Column_B in (UserA, UserB, UserC) group by Column_C, Column_A order by Column_C nulls first, custom_order;
min 子句沒有按預期進行重復資料洗掉。
uj5u.com熱心網友回復:
未經測驗:
假設你有可用的分析函式......
我把這個分開,讓我們第一次得到所有的空值......然后根據你想要的順序使用分析(row_number)、一個嵌入的 case 運算式和兩個 order bys 在非空值中聯合。
SELECT Column_A, Column_B, Column_C, 0 as RN
FROM TABLE
WHERE COLUMN_C is null
UNION ALL
SELECT Column_A, Column_B, Column_C, RN
FROM (
SELECT A.*, ROW_NUMBER() over (partition by A.column_C, Order by case A.column_B when 'UserA' then 0 else 1 end, U.Time_Created) rn
FROM Table A
INNER JOIN user U
on U.Column_B = A.Column_B
WHERE A.Column_C is not null) B
WHERE RN = 1
整個用戶加入是基于評論而不是問題。它假定表連接到 column_B 上的用戶
我們使用 case 陳述句來處理對“UserA”的排序,然后是創建時間。所以如果你有兩個“userA”,第一個創建的也將是第一個。
uj5u.com熱心網友回復:
感謝 xQbert 的幫助。更新了答案以解決一些問題:
- 磁區和順序之間沒有逗號
- 在每個子查詢中按 user_ids 過濾 - 表中可能有我們不關心的用戶。
'''
SELECT Column_A, Column_B, Column_C, 0 as RN
FROM TABLE
WHERE COLUMN_C is null and Column_B in (UserA, UserB, UserC)
UNION ALL
SELECT Column_A, Column_B, Column_C, RN
FROM (
SELECT A.*, ROW_NUMBER() over (partition by A.column_C Order by case A.column_B when 'UserA' then 0 else 1 end, U.Time_Created) rn
FROM Table A
INNER JOIN user U
on U.Column_B = A.Column_B
WHERE A.Column_C is not null and ColumnB in (userA, userB, UserC)) B
WHERE RN = 1
'''
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360560.html
標籤:sql PostgreSQL的
上一篇:如何洗掉靜態檔案htaccess上的.php檔案擴展名
下一篇:如何根據列獲得百分比
