1

我无法弄清楚一个 sql 查询(使用 MS Sql Server)。我正在尝试从数据集中检索单行,其中具有一个 id 的项目可以有多行。让我失望的部分是正确的行应该基于“层次结构”。我试图在这个问题上抛出一个案例陈述。

一些样本数据:

Id           Class       Date
100          Red         2012-12-12
100          Blue        2012-12-31
200          Red         2012-10-31
300          Green       2012-04-04
300          Blue        2011-09-01

我想根据 Class 的值返回一行。

Case When Red Then
    Date 
Case When Blue Then 
    Date
Case When Green Then 
    Date 
Else
    ''

我的最终数据集应如下所示:

Id           Class       Date
100          Red         2012-12-12
200          Red         2012-10-31
300          Blue        2011-09-01

因此,如果其中一个重复行的值为 Red,则首先使用该行中的日期。然后是蓝色,然后是绿色。

一整天都在研究这个,玩弄子查询、分组、拥有、案例陈述、派生表。我对我的 sql 技能很生疏,因为它已经有一段时间了。

关于我应该采取的方向的任何提示?

4

3 回答 3

5

你可以试试这个

;WITH cte AS
  (
    SELECT Id, Class, Date,
      row_number() OVER (PARTITION BY Id
                         ORDER BY CASE Class
                                  WHEN 'Red' THEN 1
                                  WHEN 'Blue' THEN 2
                                  WHEN 'Green' THEN 3
                                  ELSE 4 END) as rn
    FROM MyTable
   )

SELECT Id, Class, Date
FROM cte
WHERE rn = 1
于 2013-02-05T21:02:34.640 回答
0

尝试:

select id, class, date
  from TABLE
 where class = COLOR
   and date  = (select min(date) from TABLE where class = COLOR)
于 2013-02-05T21:00:15.020 回答
0

我喜欢@bobs 查询,它适用于 TSQL 数据库。

这只是做同样事情的另一种方式,可能更容易移植到其他具有公共表表达式但行号语法不同的 SQL 数据库;

;WITH cte AS
(SELECT *, CASE Class WHEN 'Red' THEN 1 WHEN 'Blue' THEN 2
                      WHEN 'Green' THEN 3 ELSE 4 END c FROM myTable)

SELECT b1.Id, b1.Class, b1.Date
FROM cte b1 
LEFT JOIN cte b2 
  ON b1.Id = b2.Id AND b1.c > b2.c
WHERE b2.Class IS NULL

一个用于测试的 SQLfiddle

于 2013-02-05T21:20:05.907 回答