我有一個帶有用戶列和“事件”列的表“事件”
| 用戶 | 事件 |
|---|---|
| 1個 | 一個 |
| 1個 | 一個 |
| 1個 | 一個 |
| 1個 | b |
| 2個 | b |
| 2個 | C |
在上面的例子中,用戶 1 從來沒有為他們出現過事件 c。我想做類似的事情
WITH table_a as (
SELECT
CASE WHEN EVENT = 'c' Then 'Y' ELSE 'n' end as event_occured,
user_id
FROM EVENTS)
然后得到如下結果
| 用戶 | 發生了 |
|---|---|
| 1個 | n |
| 2個 | 是 |
所以我首先嘗試這樣做
SELECT DISTINCT USER,'y' is_occured FROM table_a WHERE event_occured='y'
UNION
SELECT DISTINCT USER,'n' is_occured FROM table_a WHERE event_occured='n'
但這顯然有點笨拙,而且難以管理,尤其是當更多的列被添加到事件表中并且在查詢中需要時。所以接下來我嘗試使用視窗函式來做到這一點,但我不確定如何將這些值僅拉入單個用戶,我只是在尋找存在的地方。
SELECT user,
CASE WHEN ... over(partion by user)
FROM EVENTS
但我很困惑如何進行,或者這是否是正確的軌道
uj5u.com熱心網友回復:
如果你純粹是想得到 a Yor到這些,你可以用 case 運算式N做一個簡單的:MAX
select [User]
, MAX(case when [Event] = 'c' then 'Y' else 'N' end) is_occurred
from [EVENTS]
group by [User]
如果你想避免group by,你可以做一個視窗函式:
select distinct [User]
, MAX(case when [Event] = 'c' then 'Y' else 'N' end) over (partition by [User])
from [EVENTS]
如果你想把它作為一個函式,你可以引數化[Event]比較并將用戶傳遞給類似的東西:
select MAX(case when [Event] = @p_checked_event then 'Y' else 'N' end)
from [EVENTS]
where [User] = @p_checked_user
回傳該查詢的結果,并像這樣呼叫它:
select distinct [User]
, CheckEventOccurred([User], 'c')
from [EVENTS]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533825.html
標籤:数据库sql服务器
下一篇:如何在SQL中對一組行進行分類?
