我現在在查詢時遇到問題,只能檢索為每組結果保存的最后一個值。
我用一張桌子解釋自己。我有這些價值觀:
| date | analyses | result|
| ------ | --------- | ----- |
| date 8 |analysis A | 10 |
| date 7 |analysis A | 15 |
| date 6 |analysis C | 12 |
| date 5 |analysis A | 13 |
| date 4 |analysis B | 17 |
| date 3 |analysis A | 25 |
| date 2 |analysis B | 20 |
| date 1 |analysis C | 10 |
我在查詢中檢索 3 種分析型別的所有結果,并顯示它們的創建日期,從最近到最舊。
如果可能的話,我現在想改進我的查詢,以便它只為我提供每次分析的最后一個值。
預期結果是:
| date | analyses | result|
| ----- | -------- | ----- |
| date 8 |analysis A | 10 |
| date 6 |analysis C | 12 |
| date 4 |analysis B | 17 |
我的請求現在看起來像這樣:
SELECT
date,
analyses,
results
FROM
table_results,
table_analyses,
WHERE
analyse in ('analysis A','analysis B','analysis C')
ORDER BY date DESC
我嘗試在屬性分析中使用 GROUP BY 但沒有成功(錯誤:不是 GROUP BY 運算式...)。
如果有人有想法提前謝謝你,
祝你有美好的一天
uj5u.com熱心網友回復:
對我來說,它看起來像這樣:
示例資料(不想輸入太多;閱讀 mathguy 評論的內容。不管C_DATE是什么(應該是DATE資料型別),下面的查詢仍然有效):
SQL> select * from test;
C_DATE ANALYSES RESULT
---------- ---------- ----------
8 a 10
7 a 15
6 c 12
5 a 13
4 b 17
3 a 25
2 b 20
1 c 10
8 rows selected.
analyses首先按降序排列每個行c_date(以便“最后”日期排名最高),然后獲取這些行:
SQL> with temp as
2 (select c_date, analyses, result,
3 rank() over (partition by analyses order by c_date desc) rnk
4 from test
5 )
6 select c_date, analyses, result
7 from temp
8 where rnk = 1
9 order by analyses;
C_DATE ANALYSES RESULT
---------- ---------- ----------
8 a 10
4 b 17
6 c 12
SQL>
uj5u.com熱心網友回復:
創建表:
CREATE TABLE TEST_TABLE(ADATE VARCHAR(20), ANALYSES VARCHAR(20), RESULT VARCHAR(20))
INSERT INTO TEST_TABLE VALUES('date 8', 'analysis A', '10');
INSERT INTO TEST_TABLE VALUES('date 7', 'analysis A', '15');
INSERT INTO TEST_TABLE VALUES('date 6', 'analysis C', '12');
INSERT INTO TEST_TABLE VALUES('date 5', 'analysis A', '13');
INSERT INTO TEST_TABLE VALUES('date 4', 'analysis B', '17');
INSERT INTO TEST_TABLE VALUES('date 3', 'analysis A', '25');
INSERT INTO TEST_TABLE VALUES('date 2', 'analysis B', '20');
INSERT INTO TEST_TABLE VALUES('date 1', 'analysis C', '10');
從 TEST_TABLE 中選擇 *:https ://i.stack.imgur.com/PnzCm.png
解決方案:
SELECT
MAX(ADATE) KEEP(DENSE_RANK LAST ORDER BY ADATE) AS ADATE
, ANALYSES
, MAX(RESULT) KEEP(DENSE_RANK LAST ORDER BY ADATE) AS RESULT
FROM
TEST_TABLE
GROUP BY
ANALYSES
ORDER BY
ADATE DESC
結果: https ://i.stack.imgur.com/DpsDO.png
uj5u.com熱心網友回復:
您仍然可以使用 GROUP BY 獲得您想要的結果,但您必須將您的嘗試分成 2 個級別。
假設您已經有一個查詢、表或視圖可以為您提供以下資訊 - 將其稱為“測驗”,所以如果我呼叫SELECT * FROM test,我會得到以下資訊:
| date | analyses | result|
| ------ | --------- | ----- |
| date 8 |analysis A | 10 |
| date 7 |analysis A | 15 |
| date 6 |analysis C | 12 |
| date 5 |analysis A | 13 |
| date 4 |analysis B | 17 |
| date 3 |analysis A | 25 |
| date 2 |analysis B | 20 |
| date 1 |analysis C | 10 |
您在這里沒有給我們資料型別,所以我假設您的日期列是一個字串(如果它是不同的資料型別,您仍然可以將其轉換為整數或數字型別)。
我定義了一個臨時表,在其中提取了日期的數字部分(而不是“日期 8”,我只使用 8)并將其轉換為數字。這被保存為“date_number”列,這樣您就可以在其上運行 MAX 等操作分組
我在 temptable 上做了一個 GROUP BY 以獲得每個分析值的 MAX date_number 值
select * from test我用 WHERE 子句呼叫了原始表 (對于每種分析型別
簡而言之,代碼看起來像這樣
with temptable as
(select to_number(substr(to_char(the_date),6,1)) as date_number,
analyses,
result
from test)
select *
from test
where
to_number(substr(to_char(the_date),6,1)) in
(select max(date_number) from temptable
group by analyses)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/469012.html
標籤:sql 甲骨文 通过...分组 sql-order-by
下一篇:React無法決議字串物件
