News for hackers. Stuff that matters.
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by cyberax on Sunday February 02, 2025 @01:20AM (#42906448)
For me, it's not the syntax, and not even the relational model. They are fairly easy to explain.

No, it's the morass of the interactions between GROUP BY/ORDER BY/HAVING. Like, why isn't there FIRST statement to select the first element in the group?

Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by kmoser on Sunday February 02, 2025 @02:28AM (#42906840)
Not sure what getting the first row has to do with any issues you have with GROUP BY/ORDER BY/HAVING? Each of those clauses serves a distinct purpose, and I'm not sure I'd describe any interactions a "morass" since any connections between them are usually by design, and well documented. With the power of SQL (or any powerful and complex tool) comes great responsibility to understand how it works.
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by _dain_ on Sunday February 02, 2025 @04:03AM (#42907324)
WHERE and HAVING (and QUALIFY) are redundant. The PRQL language unifies them into a single "filter" construct:

SQL:

    SELECT country, MAX(salary) AS max_salary
    FROM employees
    WHERE start_date > DATE '2021-01-01'
    GROUP BY country
    HAVING MAX(salary) > 100000
PRQL:

    from employees
    filter start_date > @2021-01-01
    group country (
      aggregate {max_salary = max salary}
    )
    filter max_salary > 100_000
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by cyberax on Sunday February 02, 2025 @04:11PM (#42911873)
A very simple problem, you have a table of house sales. For each house (identified by an ID), you want to find the sale date that had the lowest price.

You'd think that you should be able to sort by the house ID, then by the sale price, then group by the house ID, and select the sale _date_ from the first row of each group.

Something like: `select s.house_id, first(s.date) from sale s order by s.house_id, s.price asc group by s.house_id`. But this is impossible, because there's no `first` function in SQL.

But nope, you need DB-specific extensions for that.

Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by kmoser on Sunday February 02, 2025 @05:59PM (#42912762)
What do you want to see if there's more than one sale date with the lowest price?

In any case, you can do this with a subquery and join it with the main table. I don't think there's anything non-standard about it:

  SELECT hs.*
  FROM house_sales hs
  JOIN (
      SELECT house_id, MIN(price) AS min_price
      FROM house_sales
      GROUP BY house_id
  ) min_prices
  ON hs.house_id = min_prices.house_id AND hs.price = min_prices.min_price
I'm sure you can do it with window functions as well.
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by cyberax on Sunday February 02, 2025 @07:19PM (#42913341)
> What do you want to see if there's more than one sale date with the lowest price?

Either one is fine.

PostgreSQL has an extension (DISTINCT ON) that allows to do what I want without subqueries. But standard SQL is simply deficient in this regard, it should be straightforward but it's not.

Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by azurezyq on Sunday February 02, 2025 @03:01AM (#42907005)
Window function is your friend.

Row_number() over (partition by x order by) as rank

Then: where rank = 1.

Grouping is unordered, which is a clean definition.

Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by helge9210 on Sunday February 02, 2025 @01:30AM (#42906509)
To have the first element, you have to describe a relation of order. It's not ordered by default.
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by calmbonsai on Sunday February 02, 2025 @02:25AM (#42906821)
True, but even going all the way back to E.F. Codd, there's "cheating" involved with all sorts of implicit sorting.

Even now, the default behavior of SQLite is still "undefined" if a Select column doesn't appear in Group By. Well, to be precise it's a single "arbitrary chosen row" used to sort the results. https://www.sqlite.org/lang_select.html#resultset

I'm not bagging on SQLite here (I love it!), but I am bagging on SQL 'cuz EVERY implementation must make far too many of these sorts of Faustian bargains.

Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by disgruntledphd2 on Sunday February 02, 2025 @04:02AM (#42907317)
That sqlite one is really annoying, many other dialects give you an error.
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by cyberax on Sunday February 02, 2025 @02:11AM (#42906740)
Actually, you don't have to. Any first element would do, even if it's a random one.

It's perfectly possible to do `SELECT * FROM blah LIMIT 1`, after all.

Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by _dain_ on Sunday February 02, 2025 @04:12AM (#42907378)
You can use ANY_VALUE to get an arbitrary value from a GROUP BY. There's also FIRST_VALUE for a window function (though that requires you specify an order).
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by cyberax on Sunday February 02, 2025 @04:13PM (#42911888)
This is a non-standard extension, and it also doesn't allow the selection of the _first_ element in a group. Even if the group is actually ordered.
Re:SQL or Death? Seminar Series – Spring 2025 – Carnegie Mel... by cyberax on Sunday February 02, 2025 @04:14PM (#42911900)