SQL:group by,order by和concat结果

时间:2013-11-07 16:03:50

标签: sql tsql sybase

sql中是否有能够有效执行此操作的功能?

形象地说,我有一个包含三列的数据库:tape_dateempl和一个字符列val;我想按照val的顺序,为每个empl连接起来,提取tape_date的最新3个值。例如,对于下表,我应该得到一行

bob, DEA

和其他empl类似。订单很重要,例如EDA bob会导致错误的结果。

我正在使用Sybase Adaptive Server Enterprise/15.7.0,但不想使用专有功能。

tape_date    empl    val
------------------------
2014-01-08   bob     A
2014-01-01   bob     G
2014-01-03   alice   K
2014-01-02   bob     D
2014-01-05   bob     E

2 个答案:

答案 0 :(得分:2)

有几种方法可以执行此操作,一种方法是使用Sybase LIST函数,如果您不介意它只在Sybase上运行。如果没有,那么您可以使用RANK和MAX来完成。像这样:

SELECT 
  CAST('2014-01-03' AS DATE) AS tape_date
  ,'alice' AS empl   
  ,'K' AS val
INTO #temp_table;
INSERT INTO #temp_table VALUES('2014-01-08', 'bob', 'A');
INSERT INTO #temp_table VALUES('2014-01-01', 'bob', 'G');
INSERT INTO #temp_table VALUES('2014-01-02', 'bob', 'D');
INSERT INTO #temp_table VALUES('2014-01-05', 'bob', 'E');


-- USING SYBASE ONLY LIST FUNCTION
SELECT empl, SUBSTR(LIST(val ORDER BY tape_date), 1, 5)
FROM #temp_table
GROUP BY empl;

-- THE GENERIC WAY
SELECT 
  empl
  ,MAX(CASE rank WHEN 1 THEN val ELSE '' END) 
    + ',' 
    + MAX(CASE rank WHEN 2 THEN val ELSE '' END)
    + ',' 
    + MAX(CASE rank WHEN 2 THEN val ELSE '' END)
FROM (
SELECT
  RANK() OVER (PARTITION BY empl ORDER BY tape_date) AS rank
  ,*  
FROM #temp_table) a
WHERE rank <= 3
GROUP BY 
  empl  

答案 1 :(得分:0)

通过查询“展平”组返回的行的唯一方法是使用过程语言(T-SQL,C#,Java)。仅在SQL中不可能。