Sql 按列选择不同的行
我有下表Sql 按列选择不同的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表 VacancyID VacancyName HourRate MarketID ------------------------------------------ 1 manager 15 NULL 2 manager 17 1 3 sales 9 NULL assistant 4 store keeper
VacancyID VacancyName HourRate MarketID
------------------------------------------
1 manager 15 NULL
2 manager 17 1
3 sales 9 NULL
assistant
4 store keeper 12 NULL
5 store keeper 13 1
6 customer 10 NULL
consultant
VacancyID-空缺的唯一标识符
VacancyName-空缺名称
小时费率小时费率
市场ID-空缺开放市场的唯一标识符。有单独的市场表,但这与这个问题无关
我需要从上表中为MarketID==1选择所有不同的空缺(通过VacancyName)。但如果某个空位未在市场1中打开,则应从MarketID==NULL的行中获取
所以对于MarketID==1,结果应该是
VacancyID VacancyName HourRate MarketID
------------------------------------------
2 manager 17 1
3 sales 9 NULL
assistant
5 store keeper 13 1
6 customer 10 NULL
consultant
对于MarketID==1,销售助理和客户顾问空缺不存在,因此它们取自MarketID==NULL。(如果特定市场没有空缺,则应采用MarketID==NULL的行中的空缺)
应该使用什么SQL命令来实现这样的结果
注意:数据库位于SQL Server 2017上。您可以使用子查询筛选
MarketID
为null
或1
,然后使用row_number()
为具有相同VacancyName
的记录组中的每个记录分配一个等级,同时降低null
值的优先级。然后,外部查询只筛选每个组的顶部记录
select VacancyID, VacancyName, HourRate, MarketID
from (
select
t.*,
row_number() over(
partition by VacancyName
order by coalesce(MarketID, 0) desc
) rn
from mytable t
where coalesce(MarketID, 1) = 1
) x
where rn = 1
order by VacancyID
要查询不同的MarketID,只需更改where
子句,查询的工作方式相同(假设n>0
):
联合(市场化,)=
:
VacancyID | VacancyName | HourRate |市场化
--------: | :------------------ | -------: | -------:
2 |经理| 17 | 1
3 |销售助理| 9 |空
5 |店主| 13 | 1
6 |客户顾问| 10 |无效
试试这个
SELECT T.*
FROM Your_Table T INNER JOIN
(
SELECT MAX(VacancyID) AS VacancyID, VacancyName
FROM Your_Table
WHERE MarketID = 1
GROUP BY VacancyName
) X
ON T.VacancyID = X.VacancyID
UNION
SELECT T.*
FROM Your_Table T
WHERE VacancyName NOT IN
(
SELECT VacancyName
FROM Your_Table
WHERE MarketID = 1
)
AND MarketID IS NULL
或
和不存在
似乎可以满足您的要求:
select t.*
from t
where marketID = 1 or
(marketID is null and
not exists (select 1
from t t2
where t2.VacancyName = t.VacancyName and
t2.marketId = 1
)
);
有了(VacancyName,MarketId)
上的索引,我希望它在大型数据集上具有非常好的性能
SELECT T.*
FROM Your_Table T INNER JOIN
(
SELECT MAX(VacancyID) AS VacancyID, VacancyName
FROM Your_Table
WHERE MarketID = 1
GROUP BY VacancyName
) X
ON T.VacancyID = X.VacancyID
UNION
SELECT T.*
FROM Your_Table T
WHERE VacancyName NOT IN
(
SELECT VacancyName
FROM Your_Table
WHERE MarketID = 1
)
AND MarketID IS NULL
select t.*
from t
where marketID = 1 or
(marketID is null and
not exists (select 1
from t t2
where t2.VacancyName = t.VacancyName and
t2.marketId = 1
)
);