假设我有一个名为extable
|--A--|--B--|--C--|
|-----|-----|-----|
|01:21| 4-1 | no |
|01:28| 4-2 | yes |
|05:53| 3-5 | yes |
|03:34| 9-1 | yes |
|18:48| 9-1 | yes |
|13:01| 9-1 | yes |
|00:17| 7-4 | yes |
|14:24| 4-1 | no |
|18:19| 4-1 | yes |
|08:02| 7-4 | yes |
|15:21| 7-4 | no |
|21:23| 3-5 | no |
|02:57| 4-2 | no |
|21:03| 4-2 | yes |
|11:31| 4-1 | no |
我如何按时间排序,列A,然后是列B,然后是列C,如下所示:
|--A--|--B--|--C--|
|-----|-----|-----|
|05:53| 3-5 | yes |
|21:23| 3-5 | no |
|18:19| 4-1 | yes |
|14:24| 4-1 | no |
|21:03| 4-2 | yes |
|02:57| 4-2 | no |
|08:02| 7-4 | yes |
|15:21| 7-4 | no |
|18:48| 9-1 | yes |
|21:56| 9-1 | no |
我希望能够按B列中从最低到最高的顺序对其进行排序。然后,我希望{B}中的每个条目的yes
选项前面都有no
。列中的时间戳A将是最新的yes
和no
条目。我觉得我解释它比上面的例子效果要差很多。
我知道我可以这样做:ORDER BY column B, column C, column A;
,但这会将每个条目从原始表中拉出来。如果有意义的话,我只希望在A列的时间戳中找到最新的那些。请注意9-1
在原始表格中有四个条目,但只提取了最新的yes
和no
选项。
谢谢
答案 0 :(得分:1)
您有两个要求:1)按照列出的顺序订购结果2)仅为每列保留最新的是/否值" B"
ORDER BY
子句非常简单。唯一的变化是坚持" DESC"在子句中的C
字段之后,yes
首先出现。
第二个要求可以使用窗口函数来解决,以便按B
和C
对结果集中的行进行分组,然后按A
对每个组中的结果进行排序。然后我们保留任何排名为1
以下内容应该有效:
SELECT A,B,C
FROM
(
SELECT
A,
B,
C,
ROW_NUMBER() OVER (PARTITION BY B, C ORDER BY A DESC) as keeprank
FROM <table>
) t1
WHERE keeprank = 1
ORDER BY A, B, C DESC