3

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

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

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
4

2 回答 2

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  
于 2013-11-07T17:33:44.367 回答
0

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

于 2013-11-07T17:05:46.767 回答