我有桌子reports:
---- -----------
| id | file_name |
---- -----------
| 1 | jan.xml |
---- -----------
| 2 | jan.csv |
---- -----------
| 3 | feb.csv |
---- -----------
用人類語言:每個月都有報告。每個報告可以是 XML 或 CSV 格式。每個月可能有 1-2 份獨特格式的報告。
我想選擇所有月份的報告,每個月只選擇一個檔案。XML 格式更可取。
所以,預期的輸出是:
---- -----------
| id | file_name |
---- -----------
| 1 | jan.xml |
---- -----------
| 3 | feb.csv |
---- -----------
說明:該檔案jan.csv已被排除,因為該月有更可取的報告:jan.xml.
uj5u.com熱心網友回復:
正如評論中提到的,您的資料結構存在許多挑戰。它確實需要一列 ReportDate 或類似日期/日期時間的內容,以便您知道報告屬于哪個月份。當您取回資料時,這也會為您提供一些排序依據。除了那些急需的改進之外,您還可以通過類似這樣的方式從樣本資料中獲得所需的結果。
create table SomeFileTable
(
id int
, file_name varchar(10)
)
insert SomeFileTable
select 1, 'jan.xml' union all
select 2, 'jan.csv' union all
select 3, 'feb.csv'
select s.id
, s.file_name
from
(
select *
, FileName = parsename(file_name, 2)
, FileExtension = parsename(file_name, 1)
, RowNum = ROW_NUMBER() over(partition by parsename(file_name, 2) order by case parsename(file_name, 1) when 'xml' then 1 else 2 end)
from SomeFileTable
) s
where s.RowNum = 1
--ideally you would want to order the results but you don't have much of anything to work with in your data as a reliable sorting order since the dates are implied by the file name
uj5u.com熱心網友回復:
您可能希望使用一個視窗函式,通過在該file_name欄位上作業,按月份磁區并按格式名稱排序來對行進行排序。
WITH ranked_reports AS (
SELECT
id,
file_name,
ROW_NUMBER() OVER(
PARTITION BY LEFT(file_name, 3)
ORDER BY RIGHT(file_name, 3) DESC
) AS rank
FROM
reports
)
SELECT
id,
file_name
FROM
ranked_reports
WHERE
rank = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454328.html
上一篇:如何根據2列找到三倍的值
下一篇:如何在oraclesql中將999-999-9999x1234567890等電話號碼格式化為999-999-9999x12345
