使用多个case语句进行分区

时间:2016-06-10 21:02:40

标签: sql sql-server sql-server-2008 tsql

我正在尝试使用partition by子句重复数据库中的记录这是我为了重复数据删除而运行的查询。它对人口最多的记录进行排名,并保持排名最高的记录。

if(!empty($rent))
{
     $result = $mysqli->query("SELECT * FROM dbc_posts WHERE city='$location' and rent_price<'$rent' ORDER BY ID ASC");
} else {
     $result = $mysqli->query("SELECT * FROM dbc_posts WHERE city='$location' ORDER BY ID ASC");
}

我想知道是否可以使用case进行分区。例如,目前我通过联系人和电子邮件进行分区。当contactowner为null时,我想通过contactofficer进行分区。 我可以创建这样的案例陈述,或者这是不可能的,因为排名将在某种程度上改变。

2 个答案:

答案 0 :(得分:2)

您可以使用case,但我认为coalesce()在这种情况下更简单:

SELECT ROW_NUMBER() OVER (PARTITION BY COALESCE(contactowner, contactofficer), email
                          . . .

如果您想要将具有相同名称的联系人和人员分开计算,那么您可以这样做:

SELECT ROW_NUMBER() OVER (PARTITION BY (CASE WHEN contactowner is NULL then 1 else 2 end),
                                       contactowner,
                                       (CASE WHEN contactowner is null THEN contactofficer END),
                                       email
                           . . .

答案 1 :(得分:1)

因此,如果contactOwner为null,那么ContactOfficer应仅用于分区目的?

在这种情况下,你可以使用。

PARTITION BY contactowner, 
             CASE WHEN contactOwner IS NULL THEN contactofficer END,
             email  . . .