根据另一篇 SO 帖子 ( SQL: How to keep rows order with DISTINCT? ),distinct 在排序方面具有相当未定义的行为。
我有一个问题:
select col_1 from table order by col_2
这可以返回类似的值
3
5
3
2
然后我需要在保留顺序的这些上选择一个不同的,这意味着我想要
select distinct(col_1) from table order by col_2
返回
3
5
2
但不是
5
3
2
这就是我真正想要做的。 Col_1 是用户 ID,col_2 是该用户的登录时间戳事件。所以同一个用户(col_1)可以有很多次登录。我正在尝试建立一个在系统中出现过的用户的历史列表。我希望能够说“我们的第一个用户曾经是,我们的第二个用户曾经是”,等等。
该帖子似乎建议使用 group by,但 group by 并不意味着返回行的顺序,所以我不明白这在这里如何适用或为什么适用,因为它似乎不会保留 group by任何订购。事实上,另一个 SO 帖子给出了一个示例,其中 group by 将破坏我正在寻找的顺序:参见 what is the difference between GROUP BY and ORDER BY in sql 中的“Peter” .有没有办法保证后一种结果?奇怪的是,如果 我 实现了 DISTINCT 子句,我肯定会先排序,然后获取结果并对列表进行线性扫描并自然地保留排序,所以我是不确定为什么行为如此不确定。
编辑:
谢谢大家!我已经接受了 IMSoP 的回答,因为不仅有一个我可以玩的交互式示例(感谢让我转向 SQL Fiddle),而且他们还解释了为什么有几件事以他们的方式工作,而不是简单地“这样做” .具体来说,不清楚 GROUP BY 不会破坏(而是将它们保留在某种内部列表中)分组依据之外的其他列中的值,并且这些值仍然可以在 ORDER BY 子句中检查。
最佳答案
这都与 SQL 语句的“逻辑顺序”有关。尽管 DBMS 实际上可能会根据各种巧妙的策略检索数据,但它必须根据某些可预测的逻辑运行。因此,就逻辑的行为方式而言,SQL 查询的不同部分可以被视为在彼此“之前”或“之后”处理。
碰巧的是,ORDER BY 子句是该逻辑序列中的最后一步,因此它无法更改“较早”步骤的行为。
如果您使用 GROUP BY,则在 SELECT 子句运行时行已被捆绑到它们的组中,更不用说 ORDER BY ,因此您只能查看已分组的列,或“聚合”在一个组中的所有值中计算的值。 (MySQL 实现了 a controversial extension to GROUP BY,您可以在 SELECT 中提及逻辑上不存在的列,它会从该组的任意行中选择一个)。
如果您使用 DISTINCT,它会在 SELECT 之后进行逻辑处理,但 ORDER BY 仍然之后来。因此,只有在 DISTINCT 丢弃了重复项后,剩余的结果才会按特定顺序排列 - 但已丢弃的行不能用于确定该顺序。
至于如何得到你需要的结果,关键是在 GROUP BY/DISTINCT 之后找到一个有效的排序依据值 已(逻辑上)运行。请记住,如果您使用 GROUP BY,任何聚合值仍然有效 - 聚合函数可以查看组中的所有值。这包括 MIN() 和 MAX(),它们是排序的理想选择,因为“最小数字”(MIN) 是相同的“如果我按升序对它们进行排序,则为第一个数字”,对于 MAX 则反之亦然。
因此,要根据每个值的最低适用 bar_number 为一组不同的 foo_number 值排序,您可以使用以下方法:
SELECT foo_number
FROM some_table
GROUP BY foo_number
ORDER BY MIN(bar_number) ASC
Here's a live demo with some arbitrary data .
编辑: 在评论中,讨论了为什么如果在分组/去重发生之前应用排序,则该顺序不适用于团体。如果是这种情况,您仍然需要一个策略,以便在每个组中保留行:第一行或最后一行。
打个比方,将原始行集合想象成从一副扑克牌中挑选的一组扑克牌,然后按面值从低到高排序。现在浏览已分类的牌组,并将它们分成每套花色的单独一堆。哪张牌应该“代表”每一堆?
如果您发牌时面朝上,最后显示的牌将是面值最高的牌(“保留最后”策略);如果您将它们面朝下发牌,然后翻转每一堆,您将看到最低 面值(“保持第一”策略)。两者都遵循牌的原始顺序,“根据花色发牌”的指令不会自动告诉发牌者(代表 DBMS)打算使用哪种策略。
如果最后一堆卡片是来自GROUP BY 的组,那么MIN() 和MAX() 代表捡起每个堆并寻找最低或最高值,而不管它们的顺序如何。但是因为您可以查看组内部,所以您也可以做其他事情,比如将每堆的总值相加 (SUM) 或有多少张卡片 (COUNT) 等,使 GROUP BY 比“有序的 DISTINCT”更强大。
关于mysql - SQL 选择不同但 "keep first"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19414474/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基