今天早上我花了過多的時間在谷歌上搜索我認為很簡單的事情。我需要設定一個選擇多列的 SQL 查詢,但如果其中一列(我們稱之為 case_number)回傳重復的行,則只回傳一個實體。
select case_number, name, date_entered from ticket order by date_entered
工單表中有些行有重復的 case_number,所以我想從結果中消除那些重復的行,只顯示它們的一個實體。如果我使用“select distinct case_number, name, date_entered”,它會將不同的運算子應用于所有三個欄位,而不僅僅是 case_number 欄位。我需要該邏輯僅適用于 case_number 欄位而不是所有三個欄位。如果我使用“按 case_number 分組,計數 (*)>1”,那么它只回傳我不想要的重復項。
任何關于在這里做什么的想法表示贊賞,非常感謝!
uj5u.com熱心網友回復:
您可以使用ROW_NUMBER(). 例如
select *
from (
select *,
row_number() over(partition by case_number) as rn
) x
where rn = 1
上面的查詢將為每個偽隨機選擇一行case_number。如果您想要更好的選擇標準,您可以ORDER BY在OVER條款中添加或視窗框架。
uj5u.com熱心網友回復:
如果您可以接受組內“名稱”的任何值,您可以按通用標準進行分組,并且只需在其他屬性上應用 MIN() 或 MAX() :
SELECT
case_number,
MIN(name) AS name,
MIN(date_entered) AS created,
MAX(date_entered) AS last_edit
FROM ticket
GROUP BY case_number
ORDER BY date_entered
這應該適用于任何 RDBMS。
此外,它不會選擇隨機值,而是讓您控制它。如果您正在處理票證中的多個“條目”,那么MIN(date_entered)肯定會在第case_number一次出現時為您提供時間戳。MAX() 會給你最后一個條目的日期......
請注意:工單表中
的重復case_number條目表明資料庫未正確規范化。在規范化模式中不需要這樣的查詢。如果您正在開發一個新的應用程式,您應該考慮重新設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323672.html
標籤:sql sql-server
上一篇:將YYYY-MM列添加到現有表
