GROUP BY中前一行的值作为列

时间:2019-06-03 07:08:13

标签: sql group-by greatest-n-per-group

我有这张桌子:

+----------+-------------+-------------------+------------------+
|    userId|       testId|               date|              note|
+----------+-------------+-------------------+------------------+
| 123123123|            1|2019-01-22 02:03:00|               aaa|
| 123123123|            1|2019-02-22 02:03:00|               bbb|
| 123456789|            2|2019-03-23 02:03:00|               ccc|
| 123456789|            2|2019-04-23 02:03:00|               ddd|
| 321321321|            3|2019-05-23 02:03:00|               eee|
+----------+-------------+-------------------+------------------+

想获取每个userIdtestId组的最新记录(整行):

SELECT
    n.userId,
    n.testId,
    n.date,
    n.note
FROM 
    notes n
INNER JOIN (
    SELECT 
        userId,
        testId,
        MAX(date) as maxDate
    FROM 
        notes
    GROUP BY 
        userId,
        testId
) temp ON n.userId = temp.userId AND n.testId = temp.testId AND n.date = temp.maxDate

有效。

但是现在我想在每行中也有以前的音符:

+----------+-------------+-------------------+-------------+------------+
|    userId|       testId|               date|         note|previousNote|
+----------+-------------+-------------------+-------------+------------+
| 123123123|            1|2019-02-22 02:03:00|          bbb|         aaa|
| 123456789|            2|2019-04-23 02:03:00|          ddd|         ccc|
| 321321321|            3|2019-05-23 02:03:00|          eee|        null|
+----------+-------------+-------------------+-------------+------------+

不知道该怎么做。我听说过LAG()函数可能有用,但找不到适合我的案例的好例子。

我想在pyspark的数据框中使用它(如果重要的话)

2 个答案:

答案 0 :(得分:2)

使用lag() and row_number分析函数

select userid,testid,date,note,previous_note
from
(select userid,testid,date,note,
lag(note)over(partition by useid,testid order by date) as previous_note,
row_number() over(partition by userid,testid order by date desc) rn
from table_name
) a where a.rn=1

答案 1 :(得分:1)

  var textModelMesh = FindMeshWithNameInModel(model, "Text");
  var textTexture = CreateCanvasTexture("Hello");

  textModelMesh.material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, map: textTexture})

我希望它会给您正确的答案。它将为您提供最新日期作为新记录,而之前的日期注释将作为previous_Note。