Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按列选择不同的行_Sql_Sql Server_Tsql - Fatal编程技术网

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
                  )
       );